修复 JSON 中的尾随逗号

对象最后一个属性或数组最后一项后面的尾随逗号在部分 JavaScript 场景下允许,但在 JSON 中并不合法。

为什么会出错

JavaScript 对象字面量经常允许末尾的逗号,但 JSON 要求最后一项后面紧跟着关闭的方括号或花括号。

出错示例

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

修复后的 JSON

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

尾随逗号是从哪儿来的

大多数都来自有人手工编辑配置、注释掉最后一项,或从 JavaScript / TypeScript 源代码里粘贴过来。模板引擎和代码生成器在循环里无脑加逗号也会产生这种问题。

为什么有些解析器接受、JSON 却不接受

JavaScript 对象字面量、JSON5、JSONC、YAML,以及大多数编程语言的字面量语法都允许尾随逗号,因为它能让 diff 更干净。但 RFC 8259 JSON 故意不允许 —— JSON.parse、Go 的 encoding/json、Python 的 json 模块这些严格解析器都会拒绝。

在进入生产前发现尾随逗号

用一个严格的 JSON 解析器在 CI 里 lint 配置文件(jq、python -m json.tool 或 node -e 'JSON.parse(...)')。对 TypeScript 项目,在 Prettier 里给 .json 文件设置 "trailingComma": "none",避免格式化时被加上。

尾随逗号并不总是真正的 bug

如果带尾随逗号的 payload 来自某个 API 或者会产出 JSON 的库,问题其实出在上游的序列化,而不是消费方。在本地把逗号修掉,只是掩盖了生成端的 bug,下一次还会复现 —— 应该去修生成端。

FAQ

问:JSON.parse 以后会接受尾随逗号吗?答:不会 —— 严格模式才是标准。问:JSON5 算不算安全的替代?答:只适合人工编辑的配置;千万别用在线协议里。问:自动修复工具能只去掉尾随逗号吗?答:可以,贴上 JSON 它会连同其他常见语法错误一起处理掉。