Skip to content

JSON 原始文本替换导致 claudian-settings.json 非法,插件崩溃 #616

@lowahijotubofika17118-debug

Description

故障现象

修改 claudian-settings.jsonsystemPrompt 字段后,Obsidian Claudian 插件加载失败,Ribbon 图标和命令均未注册。

根因

对 JSON 文件做了原始文本替换,替换内容中的 Python \n(实为 \r\n on Windows)被写入了 JSON 字符串值内部。

JSON 规范禁止字符串值中出现未转义的控制字符。
插件启动时通过 loadSettings() → JSON.parse() 解析该文件,在位置 344 遇到 \r(ASCII 13)直接抛出异常,导致 onload() 崩溃。

错误链条

  1. 尝试用 python json.load() 解析文件 → 失败(BOM + 控制字符问题)
  2. 错误决策:放弃 JSON 解析,改用原始文本替换(f.read()str.replace()f.write()
  3. 替换字符串中混入了 Python 的 \n(实为 Windows 的 \r\n),被直接写入 JSON 值内部
  4. 插件 JSON.parse() 遇到未转义控制字符 → 崩溃

正确做法

绝对禁止对 claudian-settings.json 做原始文本替换。

正确的修改流程:

  1. json.load() 解析文件(如遇 BOM,用 utf-8-sig
  2. 如解析失败,说明文件已损坏 → 先修复 JSON 结构,不能绕过解析器
  3. 修改 Python 对象中的目标字段
  4. json.dump() 序列化写回 —— JSON.stringify 会自动处理所有转义
  5. 写回后再次 json.load() 验证文件合法性

改进措施

  1. 任何对 .claudian/claudian-settings.json 的修改,必须走 JSON 解析→修改→序列化流程
  2. 解析失败时不能 bypass,必须先修复 JSON 结构
  3. 序列化后必须验证新文件可被 json.load() 正确读取
  4. 更好的方案:通过插件的 saveClaudianSettings() API 保存,从根源杜绝非法 JSON

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions