JSON、JSON5、JSONC 有什么区别
结论:三者是严格包含关系:JSON 是标准,JSONC 只多注释,JSON5 还多单引号、无引号键、尾逗号、十六进制与多行字符串。选错格式的代价通常在「接口不认」而不是「读不出来」。

结论:数据要跨系统传输就用标准 JSON,只在本地给人改的配置才用 JSONC 加注释;需要单引号、尾逗号或无引号键名时选 JSON5,并先确认加载它的工具支持。
一句话:JSONC 是 JSON 加注释,JSON5 是 JSON 加一大堆 JavaScript 习惯。
能力对照
| 特性 | JSON | JSONC | JSON5 |
|---|---|---|---|
| 双引号字符串 | ✅ | ✅ | ✅ |
| 单引号字符串 | ❌ | ❌ | ✅ |
| 键名可不加引号 | ❌ | ❌ | ✅ |
// 行注释 |
❌ | ✅ | ✅ |
/* */ 块注释 |
❌ | ✅ | ✅ |
| 尾逗号 | ❌ | ❌ | ✅ |
十六进制数 0xFF |
❌ | ❌ | ✅ |
前导小数点 .5 |
❌ | ❌ | ✅ |
Infinity / NaN |
❌ | ❌ | ✅ |
多行字符串 \ 续行 |
❌ | ❌ | ✅ |
| 标准解析器能读 | ✅ | ❌ | ❌ |
注意 JSONC 只解决注释。很多人以为「能写注释的 JSON」都支持尾逗号,实际 tsconfig.json 里多一个尾逗号照样报错。
三者各自的定位
JSON:交换格式。接口、消息队列、数据库字段、日志,只要是机器之间传,就必须是它。跨语言解析器全部现成,没有任何商量余地。
JSONC:编辑器配置格式。VS Code 的 settings.json、launch.json、tsconfig.json、ESLint 配置都能写注释,因为它们由编辑器自己解析,不经过 JSON.parse。它没有独立的 RFC,是微软主导的事实约定。
JSON5:给人写的宽松超集。设计目标是「让配置文件写起来像 JavaScript 对象字面量」。适合 .json5 后缀的构建配置(Babel、部分打包器支持),语法糖最多,但工具链支持面最窄。
怎么选
| 你的场景 | 选择 |
|---|---|
| 接口请求/响应体 | JSON,唯一选项 |
| 数据库里的 JSON 字段 | JSON,MySQL、PostgreSQL 的 JSON 函数只认标准 |
| 项目配置、要写注释说明 | JSONC(如果工具支持)或 YAML |
| 想要 JS 风格的宽松语法 | JSON5,但要确认加载它的工具支持 |
| 需要给非技术人员改 | YAML,缩进比括号友好 |
一个常被忽略的坑
把 JSONC 文件当标准 JSON 读,错误信息往往指向注释,而不是文件本身有问题:
SyntaxError: Unexpected token / in JSON at position 42
看到 / 报错,先确认文件是不是 .jsonc、tsconfig.json 这类允许注释的文件,别急着删注释——删了可能还有尾逗号,一样报错。
常见问题
JSONC 和 JSON5 应该怎么选?
只需要注释就用 JSONC,它比 JSON 只多 // 和 /* */,VS Code 的 settings.json、tsconfig.json 都是这种格式。还需要单引号、无引号键名、尾逗号、十六进制数或多行字符串时才用 JSON5。两者都依赖具体工具支持,选之前先确认加载这些文件的程序能解析。
为什么 JSONC 不能当作标准 JSON 使用?
JSONC 是事实约定而非独立 RFC,标准解析器不认注释。用 JSON.parse 读带注释的文件会抛 Unexpected token /,错误指向注释而不是数据结构本身。只有由编辑器或专门解析器读取的配置文件才适合写成 JSONC。
是否可以直接把 JSON5 文件发给接口?
不可以。接口、数据库字段和消息队列都按标准 JSON 解析,JSON5 的单引号、无引号键名和尾逗号会被拒绝。JSON5 的定位是本地给人写的配置,跨系统传输前必须转成标准 JSON。
相关工具
- JSON5 解析器:粘贴 JSON5 或 JSONC,看解析结果与规范化后的标准 JSON
- JSON 格式化与校验:只接受标准 JSON,用来验证「我的文件到底合不合规」