昨天同事调接口调了一个下午,最后发现是尾逗号 ------他把 JavaScript 对象复制过来直接当 JSON 用,数组最后一个元素后面多了个逗号,前端 JSON.parse 当场报错,而他在 200 行的 JSON 里找了一个小时。
这不是个例。JSON 语法严格,很多在 JavaScript 里「顺手」的写法,放进 JSON 就会报错。这篇文章把最高频的 5 类错误一次讲透,每类都附「报错长什么样 + 正确写法」,看完能避开 90% 的坑。
为什么 JSON 比 JavaScript「严」这么多
JS 对象和 JSON 长得几乎一样,但 JSON 是一种数据交换格式,跨语言传输,所以语法必须无歧义------该加引号就加引号,该有逗号就有逗号,一个字符都不能含糊。这就是为什么你在 JS 里写得好好的,复制到 JSON 就报错。
错误一:尾逗号(最高频,没有之一)
数组或对象的最后一个元素后面多写了一个逗号:
json
csharp
{ "name": "Tom", "age": 18, } // ❌ 对象尾逗号
[1, 2, 3,] // ❌ 数组尾逗号
{ "name": "Tom", "age": 18 } // ✅ 正确
[1, 2, 3] // ✅ 正确
报错长这样:
javascript
SyntaxError: Unexpected token , in JSON at position 18
为什么老中招:JavaScript 是允许尾逗号的(ES2017 之后数组、对象、函数参数都可以),所以从 JS 里复制数据到 JSON、或者手写时顺手加个逗号,特别容易踩。
错误二:单引号
JSON 的字符串和键只能用双引号,单引号一律非法:
json
arduino
{ 'name': 'Tom' } // ❌ 单引号
{ "name": "Tom" } // ✅ 双引号
报错通常是 Unexpected token ' 或者 Unexpected string。很多同学是从 Python/JS 的习惯带过来的,一不注意就写了单引号。
错误三:注释
JSON 标准不支持任何注释 ,// 和 /* */ 都会报错:
json
json
{
"name": "Tom" // 用户姓名 // ❌ 注释
}
想给 JSON 加说明,只有两条路:把说明写进字段值,或者改用支持注释的 JSON5 / JSONC 格式(VS Code 的 settings.json 用的就是 JSONC)。
错误四:键没有加双引号
对象的键必须是双引号包裹的字符串:
json
json
{ name: "Tom" } // ❌ 键没加引号
{ "name": "Tom" } // ✅ 正确
这个错误和错误二经常一起出现------都是从非 JSON 语境复制过来导致的。
错误五:非法值类型
JSON 只认 6 种类型,这些 JavaScript 里的值放进 JSON 都会出问题:
json
javascript
{ "n": NaN } // ❌ NaN
{ "u": undefined } // ❌ undefined
{ "fn": function(){} } // ❌ 函数
{ "d": new Date() } // ❌ Date 对象
遇到这些值,需要先手动转成 JSON 支持的表示------NaN 转 null,Date 转成 ISO 字符串,函数直接丢掉。
怎么快速定位错误,而不是肉眼找
上面 5 类错误,我写的都是「正确/错误对照」,但真实场景里你面对的是几百行挤在一起的 JSON,肉眼找真的会崩溃。
我的做法是:把 JSON 粘到 JSON 常见错误排查工具 里,它会直接告诉你错误在第几行第几列、具体是什么原因------比如「第 8 行第 15 列:多余的逗号」。比自己一行行数快得多,尤其是排查接口返回的长 JSON 时。
顺带说一句,这个工具是我自己写的(个人练手项目),数据全程在浏览器本地解析,不上传服务器,所以粘生产环境的返回数据也不用担心泄露。目前功能还不全,如果你用着有哪里不顺,欢迎直接在评论区告诉我,每条都会看。
小结
| 错误 | 一句话记忆 |
|---|---|
| 尾逗号 | 最后一个元素后面不加逗号 |
| 单引号 | 键和字符串一律双引号 |
| 注释 | JSON 里没有注释 |
| 键不加引号 | 键必须带双引号 |
| 非法值 | 只认 6 种类型 |
记住这 5 条,JSON 报错的 90% 都能秒懂。如果你还遇到过其他诡异的 JSON 报错,欢迎评论补充,我攒够一批再写一篇。