JSON5 和带注释 JSON:什么时候可以使用注释和尾随逗号
标准 JSON 的语法很严格。它适合 API、日志、数据库字段和系统之间的数据交换,但不允许注释、尾随逗号、单引号字符串,也不允许不加引号的对象字段名。
很多开发者会困惑,是因为真实项目里的配置文件经常长这样:
{
// 开发环境 API 地址
apiBaseUrl: 'https://api.example.com',
retryCount: 3,
features: {
betaSearch: true,
},
}
这不是合法的标准 JSON。它更接近 JSON5,或者类似 JSONC 的带注释配置格式。当你把这类配置复制到 API 请求、数据库字段、环境变量或只支持标准 JSON 的工具里时,这个区别就会变得很重要。
JSON5 增加了什么
JSON5 是一种更适合人工编写配置的宽松 JSON 语法。常见特性包括:
- 支持行注释和块注释。
- 对象和数组允许尾随逗号。
- 字符串可以使用单引号。
- 对象字段名在符合标识符规则时可以不加引号。
- 数字写法更宽松。
这些能力让配置文件更容易编辑、注释和代码评审。它适合构建工具、编辑器配置、本地脚本和内部配置文件。
标准 JSON 不允许什么
标准 JSON 保持更小的语法规则,这样不同语言里的解析器才能尽量一致。在严格 JSON 中:
- 对象字段名必须使用双引号。
- 字符串必须使用双引号。
- 不允许注释。
- 不允许尾随逗号。
- 顶层内容必须完整符合 JSON 语法。
例如下面这段会在 JSON.parse() 中报错:
{
"name": "MyToolster",
"enabled": true,
}
仅仅是 true 后面的最后一个逗号,就足以让整个内容变成非法 JSON。
JSON5 和 JSONC 有什么区别
JSON5 和 JSONC 都是在标准 JSON 基础上放宽语法,但它们不是同一个契约。
JSON5 是一种明确的宽松语法,包含单引号、不加引号的字段名等特性。JSONC 通常指带注释的 JSON,常见于编辑器设置和工具配置。有些 JSONC 解析器允许尾随逗号,有些则会根据工具规则拒绝。
所以更稳妥的问题不是“它看起来能不能读懂”,而是“实际读取这个文件的解析器到底支持哪些语法”。
什么时候可以使用带注释 JSON
当消费方明确支持 JSON5 或 JSONC 时,带注释 JSON 是合理的。比如某些编辑器设置、本地工具配置,或项目里明确说明支持宽松 JSON 的解析器。
但下面这些场景通常应该使用标准 JSON:
- REST API 请求体。
- Webhook payload。
- 会验证 JSON 合法性的数据库 JSON 字段。
- 浏览器里的
JSON.parse()。 - 只声明支持标准 JSON 的命令行工具。
在这些场景中,发送数据前应该移除注释和宽松语法。
如何把 JSON5 风格配置转换成标准 JSON
在把宽松配置复制到 API、数据库或生产配置前,可以按这个清单检查:
- 删除
//和/* */注释。 - 删除对象和数组里的尾随逗号。
- 把单引号字符串改成双引号字符串。
- 给所有对象字段名加双引号。
- 确认布尔值和空值是小写:
true、false、null。 - 用严格 JSON 格式化工具重新格式化并校验。
前面的 JSON5 风格示例转换成标准 JSON 后是:
{
"apiBaseUrl": "https://api.example.com",
"retryCount": 3,
"features": {
"betaSearch": true
}
}
常见错误提示
当宽松 JSON 被当成标准 JSON 解析时,错误通常会指向第一个不支持的字符。常见原因包括:
Unexpected token /:遇到了注释。Unexpected token }:闭合大括号前存在尾随逗号。Unexpected token ':使用了单引号字符串。Unexpected token a:使用了未加引号的字段名,例如apiBaseUrl。
错误信息不一定会直接说“不支持 JSON5”。它通常只会告诉你哪个字符破坏了标准 JSON 解析。
推荐处理流程
JSON5 或带注释 JSON 适合留在面向人工维护的配置文件里。只要这段数据要进入 API 请求、数据库字段,或者被浏览器原生 JSON.parse() 读取,就应该先转换成标准 JSON。
你可以用 JSON 格式化工具 快速检查内容是否合法。如果 JSON 被放进 URL 查询参数里,可以配合 URL 编码工具。如果 JSON 是通过 Base64 传输的,先用 Base64 工具 解码,再检查解码后的文本是否为标准 JSON。