JSON.parse 报错排查指南:Unexpected token 都是哪里出的问题
单引号、尾逗号、注释、BOM、返回 HTML 错误页是 JSON 解析报错的五大元凶。逐个击破,附在线校验工具用法。
一、先看懂报错
Unexpected token ' in position 1 这类报错的含义是:解析器在某个位置遇到了语法上不该出现的字符。position 从 0 计数,先定位到那个位置看字符是什么,基本就能锁定原因。
二、五大高频元凶
- 单引号:JSON 标准只认双引号,
{'a':1}直接报错。 - 尾逗号:
[1,2,]最后一项后的逗号非法。 - 注释:
// 注释和/* */都不允许。 - BOM 头:文件开头
EF BB BF,position 0 报错多半是它。 - 返回的不是 JSON:接口 500 返回 HTML 错误页,第一字符
<就炸——先看响应体再谈解析。
三、隐蔽型问题
- 控制字符:字符串里有未转义的换行/Tab(从 Excel、日志粘贴常见),要转义成
\n \t。 - undefined/NaN:JS 对象含这些值时 JSON.stringify 会删字段或变 null,回环解析时结构变了。
- 大整数精度:超过 2^53 的数字 JS 解析后末位变 0,不报错但数据错——ID 类字段用字符串传。
- 编码不一致:GBK 编码的「中文 JSON」按 UTF-8 解析,字符乱掉甚至截断字符串引号。
四、排查流程
- 把响应原文打出来:
console.log(typeof data, data?.slice?.(0, 100)),先确认拿到的是字符串、开头是什么。 - 贴到在线 JSON 校验工具格式化,报错行号一目了然。
- 确认 HTTP 状态码与 Content-Type,别把错误页当 JSON 解析。
- 生成端修根因,而不是解析端 try-catch 吞异常。
在线体验
不用装任何环境,直接用本站JSON 格式化校验工具在线操作,数据都在浏览器本地处理,方便又安全。
常见问题
为什么 JSON 不支持注释?
设计取舍:JSON 定位是机器交换格式,注释属人类可读性需求,加进来增加歧义(注释边界)。需要注释用 JSON5/JSONC,或约定 _comment 字段。
接口明明返回 JSON 还是报错?
九成是响应前被塞了东西:PHP 的警告输出、BOM 头、Nginx 错误页、调试工具注入的代码。看响应原文第一个字符,是 < 就查后端报错,是空白就查 BOM。
2^53 之外的数字为什么要用字符串?
JS Number 是 64 位浮点,安全整数上限 2^53-1,超出后部分整数无法精确表示(末位归零)。ID 传字符串是跨语言最稳做法,Java/Python 端再按需转换。
