JSON 解析失败的 7 大原因与排查方法(附在线校验工具)
为什么 JSON.parse 会失败?
JSON 是最严格的数据交换格式:键必须用双引号、字符串内不可裸换行、不允许注释、末尾不能有逗号。任何一条不符合规范,JSON.parse() 就会抛出 SyntaxError。下面按出现频率排序,逐一拆解 7 类根因与修复方法。
1. 多余的逗号(最常见)
对象和数组的最后一个元素后面不允许有逗号,这是 JSON 与 JavaScript 对象字面量最容易被忽略的差异。
// 错误:末尾逗号
{"name": "aistool", "tools": 100,}
// 正确
{"name": "aistool", "tools": 100}
排查方法:把内容粘到 JSON 格式化工具,解析错误会精确提示到行号。
2. 单引号与无引号键名
JSON 只认双引号。单引号键、不带引号的键(合法的 JS 写法)在 JSON 里都是非法字符。
// 错误
{'name': 'aistool'}
{name: "aistool"}
// 正确
{"name": "aistool"}
3. 字符串里的裸换行与未转义引号
字符串值中不能直接出现换行符,需要用 \n 转义;字符串内部的引号必须写作 \"。
// 错误:裸换行
{"desc": "第一行
第二行"}
// 正确
{"desc": "第一行\n第二行"}
4. 带 BOM 头或不可见字符
从 Windows 记事本或某些 CMS 导出时,文件头部可能携带 UTF-8 BOM(\uFEFF),JSON.parse 会直接失败。解法:解析前先 str.replace(/^\uFEFF/, "")。
5. 大小写关键字:null / true / false
JSON 的布尔与空值必须是小写:null、true、false。写成 NULL、True、None(Python 习惯)都会报错。
6. 大数字精度问题(不报错但数据变了)
超过 Number.MAX_SAFE_INTEGER(9007199254740991)的整数,如 19 位雪花 ID、时间戳毫秒值,会被 JS 截断精度。这是“解析成功但结果不对”的隐形坑,后端 ID 建议用字符串传输。
7. 非 JSON 内容:HTML、错误信息、日志
接口返回 502/超时/被网关拦截时,body 里可能是 HTML 或错误文本而不是 JSON。建议解析前先做类型判断:typeof data === "string" && data.trim().startsWith("{")。
三步排查法
- 用 JSON 在线格式化/校验工具 粘贴原文,看精确错误行号
- 对照上表检查逗号、引号、BOM、大小写四类高频问题
- 确认数据来源是否经过中转层(网关/代理)篡改
常见问题
Q:JSON.parse 报 Unexpected token 是什么意思? 通常是遇到规范不允许的字符,最常见的是单引号、末尾逗号或 BOM。
Q:为什么同一段 JSON 在 Python 里能解析、JS 里报错? Python 的 json 模块对部分严格性要求与 JS 不同,例如 NaN、Infinity Python 默认拒绝而 JS 行为不同,两端都需用各自规范校验。
Q:JSON 和 JSONP 是一回事吗? 不是。JSON 是数据格式,JSONP 是借助 script 标签跨域加载的旧方案,返回的是包裹数据的 JS 表达式。
