修复 JSON 中的单引号

JSON 字符串与对象键必须使用双引号。单引号值常见于 JavaScript 片段、类 Python 输出以及 LLM 响应中。

为什么单引号不行

严格 JSON 只接受双引号字符串。解析器会拒绝 {'name':'Ada'},尽管 JavaScript 开发者可能觉得这写法很眼熟。

出错示例

{ 'name': 'Ada', 'active': true }

修复后的 JSON

{ "name": "Ada", "active": true }

单引号文本来自哪里

Python 的 repr() 和 dict 打印、从控制台输出复制的 JavaScript 对象字面量、Ruby 的 hash inspect 输出,以及很多 LLM 回复,都会用单引号。它们都不是 JSON —— 而是各语言原生的字面量,只是长得像而已。

为什么直接 find-replace 很危险

无脑把 ' 替换成 ",会破坏内含撇号的值,比如 { 'note': 'it\'s fine' }。替换之后内部的撇号会和新的字符串定界符冲突。安全的转换器必须跟踪引号上下文,只替换定界符而不动内部字符。

安全的转换策略

先做 token 化:扫描文本,按开头的引号识别字符串边界,再用双引号重新拼接每个 token —— 对内部出现的双引号做转义,并去掉原本多余的转义单引号。本站的修复工具一次就能完成这件事。

与之相关的 JSON 语法错误

带单引号的 JSON 通常还伴随着其他 JavaScript 风格的小问题:未加引号的键、尾随逗号、行注释或 undefined。修完引号之后,再校验一遍,看看还有没有别的问题。

FAQ

问:JSON5 接受单引号字符串吗?答:是的,JSON5 允许。问:Python 的 json.loads 会接受单引号吗?答:不会 —— 如果源真的是 Python 字面量,请用 ast.literal_eval;否则先把引号换过去。问:JSON 的键也必须用双引号吗?答:是的 —— 键本身也是字符串,遵循同样规则。