JSON、JSONC、JSON5 看起来很像,但它们的定位不同。把它们混用,是很多解析报错的来源。
{
// JSONC / JSON5 allow comments in some tools
name: 'ToolGarden',
tags: ['json', 'tools'],
}核心区别
| 格式 | 是否标准 JSON | 主要特点 |
|---|---|---|
| JSON | 是 | 严格、通用、适合接口和数据交换 |
| JSONC | 不是标准 JSON | 常见于配置文件,允许注释,语法整体接近 JSON |
| JSON5 | 不是标准 JSON | 更接近 JavaScript 对象字面量,允许单引号、尾逗号、未加引号 key 等 |
为什么 API 通常只接受标准 JSON?
API、数据库、消息队列和第三方平台需要跨语言解析。同一份数据可能会被 JavaScript、Java、Go、Python、Rust 等不同运行时读取。标准 JSON 的好处是规则少、歧义低、解析器行为更一致。
- 注释不是数据,发送给 API 后没有统一语义。
- 尾逗号、单引号、未加引号 key 在不同解析器中支持不一致。
- NaN、Infinity 等值不是标准 JSON,很多后端会直接拒绝。
- 配置文件可以照顾人类阅读,接口数据更强调机器稳定解析。
为什么 tsconfig.json 可以写注释?
很多人第一次看到 tsconfig.json 里的注释会疑惑:文件扩展名明明是 .json,为什么还能写 // 注释?原因是 TypeScript 工具链按 JSONC 方式读取配置,它不是普通 JSON API 的解析规则。
| 文件或场景 | 常见格式 | 能否直接发给普通 API |
|---|---|---|
| tsconfig.json | JSONC 风格配置 | 不能假设可以 |
| VS Code settings.json | JSONC 风格配置 | 不能假设可以 |
| package.json | 标准 JSON | 通常可以 |
| 接口请求体 | 标准 JSON | 应该使用标准 JSON |
把 JSONC / JSON5 转成标准 JSON 的步骤
- 先解析宽松语法,确认内容能被 JSONC 或 JSON5 解析器理解。
- 移除注释、尾逗号,补齐未加引号的 key。
- 把单引号字符串转换成双引号字符串。
- 检查是否存在 NaN、Infinity、undefined 这类标准 JSON 不支持的值。
- 最后用标准 JSON 校验器再验证一遍。
什么时候用哪一个?
- 接口请求和响应:使用标准 JSON。
- 需要给人读的配置文件:可以考虑 JSONC,但要确认工具链支持。
- 希望写法更像 JavaScript:可以用 JSON5,但不适合直接发给普通 API。
- 要发送给后端、数据库或第三方系统:先转换成标准 JSON。