JSON 是现在接口返回和配置文件里最常见的数据格式,但它的语法特别严格——多一个逗号、少一个引号、写一行注释,都会直接报错。日常开发中,JSON.parse 失败大概是碰到最多的运行时错误之一。这篇把常见的几类 JSON 格式错误逐个拆开讲,遇到报错的时候对照着查。
最常见的六种 JSON 格式错误
1. 尾随逗号
现象:浏览器报 Unexpected token } in JSON at position N,Node.js 里报 Unexpected token。
错误写法:
{
"name": "张三",
"age": 28,
}
最后一个属性后面多了一个逗号。这在 JavaScript 对象里没问题,但标准 JSON 不允许。修复:把最后一个逗号删掉。手动拼 JSON 或者从 JS 对象搬过来的时候特别容易留尾逗号。
2. 单引号代替双引号
现象:报 Unexpected token ' in JSON 或者 Unexpected string。
错误写法:
{
'name': '张三',
'age': 28
}
JSON 规范要求键名和字符串值都必须用双引号,单引号不行。这是从 JavaScript 习惯搬过来最容易犯的错。修复:把所有单引号换成双引号。
3. 写了注释
现象:报错位置指向 // 或 /* 处。
错误写法:
{
// 用户信息
"name": "张三",
"age": 28 /* 年龄 */
}
JSON 不支持任何形式的注释,这是设计之初就定下来的——JSON 的定位是数据交换格式,不是配置文件。如果你确实需要注释,考虑用 JSON5、JSONC 或者直接用 YAML。修复:把注释全删掉。
4. 键名没有加引号
现象:报 Unexpected token n in JSON。
错误写法:
{
name: "张三",
age: 28
}
跟单引号的问题类似,JSON 要求键名必须是双引号包裹的字符串,不能省略。修复:给所有键名加上双引号。
5. 字符串里有未转义的特殊字符
现象:报错位置在字符串中间,或者解析出来的内容被截断了。
常见情况:
- 字符串里直接写了双引号:
"desc": "他说"你好"" - 换行符直接写在字符串里(JSON 不允许字面换行)
- 反斜杠没转义:Windows 路径
"C:\Users\test",这里\U和\t会被当成转义序列
修复:双引号写成 \",换行用 \n,反斜杠写成 \\。路径应该写成 "C:\\Users\\test"。
6. 包含 undefined、NaN、Infinity
现象:解析出来值不对,或者 JSON.parse 直接报错。
JSON 只支持 null、true、false、数字、字符串、数组和对象。undefined、NaN、Infinity 都不是合法的 JSON 值。通常这个问题出在后端序列化时——JSON.stringify 会把 undefined 的字段直接跳过,把 NaN 转成 null,但如果手动拼字符串就可能出问题。
浏览器报错信息怎么读
不同环境报错格式不太一样,但核心信息都是出错位置:
| 环境 | 报错格式 |
|---|---|
| Chrome / Edge | Unexpected token X in JSON at position 42 |
| Firefox | JSON.parse: expected property name at line 3 column 5 |
| Node.js | Unexpected token X in JSON at position 42 |
position 是从 0 开始的字符偏移量,拿到这个数字去原文里数到那个位置,基本就能看到问题出在哪。不过要注意,报错位置有时候指向出错字符的下一个位置——比如尾随逗号的问题,报错会指向 } 而不是逗号本身。
如果不想手动数字符,把 JSON 粘贴到格式化工具里,它会直接高亮出错位置,比肉眼看快得多。
用工具快速定位和修复
手动排查比较费眼,尤其 JSON 很长的时候。推荐做法:
- 把 JSON 粘贴到 JSON 格化工具的输入框
- 工具尝试解析,出错时显示错误信息和出错位置
- 根据提示定位到出错的那一行,修改后重新格式化
- 确认没有错误后,复制结果使用
格式化的另一个好处是,重新排版后缩进对齐,结构问题(括号不匹配、数组没闭合)会变得很明显。
怎么避免 JSON 格式错误
- 别手写 JSON:用
JSON.stringify()序列化对象,不要手动拼字符串 - 配置文件用 JSON5 或 YAML:如果需要注释和灵活语法
- 编辑器装校验插件:VS Code 对
.json文件自带语法检查,保存时标红提示 - 接口返回先格式化看一眼:联调时养成习惯,拿到返回先格式化检查
常见问题 FAQ
JSON.parse 报 Unexpected token 是什么意思?
说明解析器在某个位置遇到了不该出现的字符。最常见的原因是尾随逗号、单引号、注释或键名没加引号。报错信息里的 position 数字告诉你出错的字符位置,从 0 开始计数,去原文里找到那个位置就能定位问题。
JSON 里能不能写注释?
标准 JSON 不支持任何形式的注释,不能写 // 也不能写 /* */。这是 JSON 作为数据交换格式的设计决定。如果需要注释,可以改用 JSON5、JSONC 或 YAML,它们都支持注释。
为什么 JSON.stringify 的结果拿去 JSON.parse 没问题,手动拼的就不行?
JSON.stringify 会自动处理引号转义、特殊字符、非法值,输出的一定是合法 JSON。手动拼字符串则容易遗漏转义、写错引号、多加逗号。所以需要生成 JSON 的场景,都应该用 JSON.stringify 而不是手动拼接。
有没有办法在编辑器里自动检查 JSON 语法?
VS Code、WebStorm 等主流编辑器对 .json 文件自带语法检查,保存时会标红提示错误位置。也可以装 Prettier 之类的插件,保存时自动格式化和校验。