JSON 和 JS 对象不是一回事
JSON 是数据交换格式,比 JS 对象字面量严格:键必须双引号、字符串必须双引号、不能写注释、不能有尾逗号。很多报错就是把 JS 对象写法直接搬进了 JSON。
高频错误清单
- 尾逗号:
[1, 2, 3,]末尾多一个逗号; - 单引号:
{'name': 1}应改成双引号; - 键没加引号:
{name: 1}必须写成"name"; - 注释:
//和/* */都不合法。
快速排查思路
- 看报错里的行号列号,多数解析器会直接指出出错位置;
- 检查报错行的上一行:缺逗号或多逗号最常见;
- 字符串里的双引号要转义成
"; - 拿不准就先格式化一遍,缩进清楚了再逐段看。
合法与非法写法对照
| 部分 | JS 对象字面量 | 合法 JSON |
|---|---|---|
| 键 | {name: 1} | {"name": 1} |
| 字符串 | 'abc' | "abc" |
| 尾逗号 | [1, 2,] | [1, 2] |
| 注释 | // 说明 | 不支持 |
| 特殊值 | undefined、NaN | 只能用 null |
安全地解析
// 别直接 parse 不可信输入,包一层错误处理
function safeParse(text) {
try {
return { ok: true, data: JSON.parse(text) };
} catch (e) {
// e.message 通常带位置,例如 "Unexpected token } in JSON at position 42"
return { ok: false, error: e.message };
}
}
// 命令行校验与格式化(jq)
// jq . data.json → 校验并美化输出
// jq -c . data.json → 压缩为单行
开发时格式化(2 空格缩进)方便读,传输时压缩减体积。含敏感数据的 JSON 尽量用本地工具处理,别贴到不靠谱的在线服务。另外留意两点:带 UTF-8 BOM 的文件直接解析会报错,要先剥掉;超过 2^53 的大整数 ID 和金额用字符串传,否则 JS 数字会丢精度。
JSON、YAML、TOML 怎么选
- JSON:机器间交换的事实标准,不支持注释和多行字符串,适合 API 和程序生成的配置;
- YAML:可读、支持注释,适合人维护的配置,但缩进敏感、隐式类型坑多;
- TOML:语义明确、不易歧义,适合项目配置(如
Cargo.toml、pyproject.toml)。
几个常被问到的问题
格式化和压缩会改数据吗?不会,只动空白和缩进。重复键以哪个为准?解析时通常取最后一个,容易埋雷,尽早发现。JSON 和 JSON5 什么区别?JSON5 允许注释、单引号和尾逗号,但通用解析器不认,别把它当 JSON 用。
动手试试:JSON 格式化