JSON 常见报错怎么排查:8 种错误写法与修改方法
调接口时控制台弹出 SyntaxError: Unexpected token,改配置文件后程序起不来,日志只说“JSON 解析失败”——这些问题十有八九是 JSON 格式写错了。JSON 规则其实很少,但比 JavaScript 对象严格得多。下面按出现频率整理 8 种常见错误,每种都给出错误写法和正确写法。
先记住 JSON 的六条规则
- 最外层通常是对象
{}或数组[](标准也允许单个值)。 - 键名必须是双引号字符串。
- 字符串只能用双引号,内部的双引号和反斜杠要转义。
- 值只能是字符串、数字、
true、false、null、对象、数组。 - 元素之间用逗号分隔,最后一个元素后面不能有逗号。
- 不支持注释。
错误 1:末尾多余的逗号
{"name": "冰原", "tags": ["a", "b",]}
JavaScript 允许数组和对象末尾带逗号,JSON 不允许。删除 "b" 后面的逗号即可。这是从代码里复制数据时最常见的错误。
错误 2:单引号
{'name': '冰原'}
Python 的 print(dict) 输出就是单引号格式,看起来像 JSON 但不是。Python 里应该用 json.dumps(data, ensure_ascii=False) 生成真正的 JSON。
错误 3:键名没有引号
{name: "冰原"}
JavaScript 对象字面量可以这样写,JSON 必须写成 {"name": "冰原"}。前端用 JSON.stringify(obj) 生成,就不会出这个问题。
错误 4:带注释
{
// 端口号
"port": 8080
}
标准 JSON 没有注释语法。有些工具(如 VS Code 的配置文件)支持带注释的 JSONC 格式,但普通解析器会报错。需要说明时可以加一个 "_comment" 字段,或者改用 YAML、TOML 这类支持注释的格式。
错误 5:Unexpected end of JSON input
意思是“还没读完就结束了”,常见原因有三个:
- 括号没闭合,比如漏了最后一个
}; - 接口返回了空字符串,前端却直接
JSON.parse; - 日志或网络传输时内容被截断。
前两个原因占绝大多数。前端调用接口时,可以先检查 response.status 和返回内容是否为空,再解析。
错误 6:Unexpected token < in JSON at position 0
第一个字符就是 <,说明拿到的根本不是 JSON,而是一个 HTML 页面——通常是 404 页面、登录页、网关错误页或者 Nginx 的报错页。这时别去改 JSON,应该去查请求地址、登录状态和服务器状态。在浏览器开发者工具的“网络”面板里点开这个请求,看“响应”内容就一目了然。
错误 7:非法值
{"a": undefined, "b": NaN, "c": 0123, "d": .5}
undefined、NaN、Infinity 都不是合法 JSON 值;数字不能有前导零,也不能省略小数点前的 0。改为 null、123、0.5 等合法写法。
错误 8:字符串里有未转义的字符
{"path": "C:\new\data", "msg": "他说"你好""}
反斜杠要写成 \\,字符串中的双引号要写成 \",换行要写成 \n,不能直接在字符串里按回车。Windows 路径是这类错误的高发区,正确写法是 "C:\\new\\data"。
如何快速定位错误位置
不同浏览器、不同语言的报错信息不一样,有的给“position 123”(第几个字符),有的给行号和列号,新版浏览器有时只给一段上下文。几个实用技巧:
- 把内容粘到格式化工具里,让它指出具体行和列。
- 错误位置往往在报告位置的前面。比如漏了一个逗号,解析器要读到下一个键名时才发现不对。
- 内容很长时用“二分法”:删掉一半看是否还报错,逐步缩小范围。
- 注意从网页、聊天软件复制来的中文引号
“ ”,它们看起来像双引号,但不是。
大数字精度问题
这不会报错,但更隐蔽:JavaScript 的数字是双精度浮点数,超过 253(约 9007 万亿)的整数会丢精度。比如接口返回订单号 12345678901234567890,前端解析后末尾几位可能变化。解决办法是后端把这类 ID 输出为字符串。
用工具检查
本站的 JSON 格式化 / 压缩 / 校验工具 会在出错时显示第几行第几列,并在出错的那一行下方用 ^ 标出位置;校验通过后可以一键格式化或压缩。所有处理在浏览器本地完成,可以放心粘贴包含内部字段的接口数据。如果数据是 Base64 编码过的,可以先用 Base64 解码 还原后再检查。