JSON 解析失败的 10 个常见原因及修复方法
2026-08-06
几乎每个开发者都遇到过这样的时刻:接口返回一段 JSON,解析器却冷冰冰地抛出一句 Unexpected token 或 Unexpected end of JSON input,却不告诉你到底错在哪。JSON 的语法规则其实很简单,但正因为规则严格,任何一个小小的笔误都会让整个文档无法解析。这篇文章把实际工作中最常见的 10 类 JSON 格式错误整理出来,每一类都给出错误示例和修复方法,帮你下次遇到报错时少猜十分钟。
1. 键名没有加双引号
JSON 规定所有键名必须用双引号包裹,这是它和 JavaScript 对象字面量最容易混淆的地方。在 JS 里写 {name: "Tom"} 完全合法,但作为 JSON 它无法解析:
{ name: "Tom", "age": 30 }
修复方法很简单:给所有键名补上双引号,即 { "name": "Tom", "age": 30 }。很多从 JavaScript 代码里复制出来的”JSON”都带着这个问题。
2. 字符串用了单引号
JSON 只认双引号。'hello' 在 JSON 里是非法的,必须写成 "hello"。这个错误经常出现在从 Python 字典复制数据的时候——Python 的 repr 输出默认用单引号,直接粘贴过来就会报错。如果需要批量转换,最稳妥的办法是在 Python 里用 json.dumps() 输出,而不是直接复制字典的打印结果。
3. 多余的尾逗号(trailing comma)
这是出现频率最高的错误,没有之一:
{
"name": "Tom",
"age": 30,
}
数组或对象的最后一个元素后面不能再跟逗号。JavaScript 和 Python 都允许尾逗号,但 JSON 不允许。修复方法是删掉最后一个元素之后的逗号。如果你用的是 JSON5 或带注释的 JSONC(比如 VS Code 的配置文件),尾逗号是合法的——但标准 JSON 解析器不接受。
4. 注释
标准 JSON 不支持任何形式的注释。//、/* */、# 都会导致解析失败。很多人习惯在配置文件里写注释,这在 JSONC 里可以,在交给 JSON.parse 的字符串里不行。如果你的数据来自某个配置文件,先确认读取它的程序是否做了预处理。
5. 特殊值:NaN、Infinity、undefined
JSON 的值只能是:字符串、数字、布尔值、null、对象、数组。NaN、Infinity、undefined 都不是合法的 JSON 值。当后端程序把一个包含 NaN 的结构直接序列化成”JSON”时,就会产生无法解析的输出。修复方法是在序列化之前把这些值替换成 null 或字符串。
6. 引号和换行没有转义
字符串内容里如果包含双引号,必须用反斜杠转义:"He said \"hi\""。同样,字符串内不能直接换行,换行要写成 \n。从日志或文档里复制 JSON 时,转义符经常被意外吃掉,导致解析错误。遇到这种情况,把 JSON 粘贴到格式化工具里能很快看出断在哪。
7. 编码问题:看不见的 BOM
有些编辑器保存文件时会在开头加一个不可见的字节顺序标记(BOM),肉眼完全看不出来,但严格的解析器会报 Unexpected token。如果一段 JSON 看起来完全正常却解析失败,先用十六进制查看器或 file 命令检查文件开头有没有 EF BB BF 这三个字节。
8. 数字格式错误
JSON 的数字不允许前导零(01 非法)、不允许十六进制(0x1F 非法)、不允许省略整数部分(.5 非法,要写 0.5)。如果你的”数字”其实是编号、电话号码或身份证号,它们应该以字符串形式存储,这既是语法问题也是数据建模问题。
9. 结构不完整:Unexpected end of JSON input
这个报错几乎总是意味着 JSON 被截断了——少了一个右括号、右中括号或右引号。常见原因是网络传输中断,或者复制时漏掉了末尾。把内容粘贴到格式化工具里,通常一眼就能看出结构断在哪里。
10. 整个响应根本不是 JSON
有时接口在出错时返回的是 HTML 错误页或纯文本,而客户端代码仍然调用 JSON.parse,于是报出 Unexpected token < in JSON。这时错误信息里的第一个字符就是线索:< 说明返回的是 HTML。先打印原始响应看看,比盯着解析错误猜要高效得多。
快速定位问题的实用流程
遇到 JSON 解析失败,推荐按这个顺序排查:第一步,把完整内容粘贴到 JSON 格式化工具,它会标出第一个语法错误的位置,大部分问题到这一步就解决了;第二步,如果内容嵌套很深、看不出结构问题,用 JSON 可视化工具 把数据展开成树状视图,逐层检查;第三步,如果报错信息里有第一个非法字符,回到上面的清单对号入座。
养成一个好习惯能省掉很多麻烦:程序之间交换数据时,永远用标准库做序列化和反序列化,不要手工拼接 JSON 字符串——手工拼接是上面一半错误的共同根源。