首页 / 教程文章 / JSON 解析失败的 7 大原因与排查方法(附在线校验工具)

JSON 解析失败的 7 大原因与排查方法(附在线校验工具)

发布于 2026-08-17 20:25:02 · 52 阅读 · 标签:JSON,JSON.parse,前端,报错排查

为什么 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 的布尔与空值必须是小写:nulltruefalse。写成 NULLTrueNone(Python 习惯)都会报错。

6. 大数字精度问题(不报错但数据变了)

超过 Number.MAX_SAFE_INTEGER(9007199254740991)的整数,如 19 位雪花 ID、时间戳毫秒值,会被 JS 截断精度。这是“解析成功但结果不对”的隐形坑,后端 ID 建议用字符串传输。

7. 非 JSON 内容:HTML、错误信息、日志

接口返回 502/超时/被网关拦截时,body 里可能是 HTML 或错误文本而不是 JSON。建议解析前先做类型判断:typeof data === "string" && data.trim().startsWith("{")

三步排查法

  1. JSON 在线格式化/校验工具 粘贴原文,看精确错误行号
  2. 对照上表检查逗号、引号、BOM、大小写四类高频问题
  3. 确认数据来源是否经过中转层(网关/代理)篡改

常见问题

Q:JSON.parse 报 Unexpected token 是什么意思? 通常是遇到规范不允许的字符,最常见的是单引号、末尾逗号或 BOM。

Q:为什么同一段 JSON 在 Python 里能解析、JS 里报错? Python 的 json 模块对部分严格性要求与 JS 不同,例如 NaN、Infinity Python 默认拒绝而 JS 行为不同,两端都需用各自规范校验。

Q:JSON 和 JSONP 是一回事吗? 不是。JSON 是数据格式,JSONP 是借助 script 标签跨域加载的旧方案,返回的是包裹数据的 JS 表达式。

更多文章