JSON 工具箱

JSON、JSON5、JSONC 有什么区别

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

入门约 4 分钟发布于 2026-10-30更新于 2026-10-30
JSON、JSON5、JSONC 能力对比表

结论:数据要跨系统传输就用标准 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。

相关工具

延伸阅读