3Q工具箱
首页 / 教程中心 / 开发辅助

JSON 报错怎么定位:格式校验、常见语法坑与结构对比

开发辅助发布于 2026-09-06

联调时最常见的一句话是「接口返回的 JSON 解析失败」。JSON 的语法规则极少,出问题的地方也就那么十几种,问题在于浏览器的报错信息往往只给一个字符偏移量,人肉数到第 4213 个字符是不现实的。

这篇把定位顺序和常见坑列清楚,照着走一遍基本都能解决。

一、先校验,再读报错

拿到一段可疑的 JSON,第一步不是盯着看,而是丢进JSON 检验让解析器告诉你错在哪一行。工具会把出错位置定位到具体行列并高亮,比 Uncaught SyntaxError: Unexpected token } in JSON at position 4213 直观得多。

校验通过之后再做格式化。格式化的作用是把压缩成一行的内容按层级缩进展开,缩进本身不影响机器解析,但对人来说是能不能看懂嵌套结构的分界线。

顺序不要颠倒:格式化工具通常要求输入已经是合法 JSON,非法输入直接格式化只会得到一句「解析失败」,反而丢掉了错误位置信息。

二、九成的错都在这几处

尾随逗号{"a": 1, "b": 2,} 在 JavaScript 对象字面量里合法,在 JSON 里非法。手写或者拼字符串时最容易留下这个,删掉数组、对象最后一个元素时也常常忘删逗号。

单引号{'name': 'tom'} 不是 JSON。JSON 规定字符串必须用双引号,键名也必须加双引号——{name: "tom"} 同样非法。这类内容通常是从 JS 代码或 Python 字典里直接复制来的。

注释。JSON 标准不支持 ///* */。配置文件里带注释的那种写法属于 JSON5、JSONC 等扩展方言,标准解析器一律报错。

NaN、Infinity、undefined。这三个都不是合法 JSON 值。后端语言序列化浮点数时如果出现了 NaN,很多库会直接写进去,结果前端解析炸掉。合法的空值只有 null

多余的最外层内容。日志里复制出来的内容经常带前缀,比如 response: {"code":0},或者末尾多粘了一段。JSON 文档必须是单个值,前后不能有游离字符。

BOM 头。从 Windows 记事本另存的 UTF-8 文件可能带 EF BB BF 三个字节,肉眼不可见,解析器会报「位置 0 有意外字符」。遇到「明明第一个字符就是 { 却说位置 0 出错」,基本就是它。

换行没转义。字符串里的真实换行必须写成 \n,直接敲回车换行是非法的。制表符同理。

三、能解析成功但结果不对的情况

这类更麻烦,因为没有报错。

大整数精度丢失。JavaScript 的数字是双精度浮点,安全整数上限是 2^53−1(9007199254740991)。雪花 ID、订单号这类 19 位数字用 JSON.parse 解析后末几位会变化,比如 7213456789012345678 变成 7213456789012345000。解决办法是让后端把这类 ID 用字符串返回,前端不要参与数值运算。

键名重复{"a":1,"a":2} 是合法 JSON,但标准没规定该取哪个值,主流实现是后者覆盖前者。拼接字符串生成 JSON 时容易出现,且非常难查。

布尔与字符串混淆"false" 是有内容的字符串,在 JavaScript 里是真值。配置项写成字符串 "false" 后判断永远成立,是个经典坑。

四、两份 JSON 对不上时

「测试环境好的,生产环境不对」这种情况,与其逐字段看,不如把两份数据丢进JSON 差异对比。它按结构逐层比较,输出新增、缺失、值变化三类差异,比肉眼扫两个几百行的文件可靠得多。

对比之前有两件事要做:

  1. 两边都先格式化,统一缩进,否则纯文本比对会被格式差异淹没。
  2. 注意键顺序。JSON 对象的键在语义上是无序的,{"a":1,"b":2}{"b":2,"a":1} 等价。结构化对比工具会忽略顺序差异,纯文本 diff 不会——这是应该用 JSON 专用对比而不是通用文本对比的原因。

五、顺手能做的两件事

生成类型定义。拿到一份接口返回样例,用 JSON 转类型定义直接生成 TypeScript interface 或其他语言的结构体,比手敲一遍准确,也不容易漏掉可选字段。注意生成结果只反映这一份样例,样例里为 null 的字段无法推断真实类型,需要自己补。

和 YAML、XML 互转。CI 配置、K8s 清单常用 YAML,老接口常用 XML,用 YAML JSON XML 互转可以省掉手工改写。YAML 转 JSON 时要留意:YAML 里未加引号的 yesnoonoff 在部分解析器中会变成布尔值,端口号 08 这种带前导零的写法也可能被当作八进制。

常见问题

报错说「位置 0 有意外字符」,但开头明明是 { 八成是 BOM 头或者不可见的零宽字符。把内容重新粘贴一遍,或者用文本工具清理首部不可见字符。

为什么我的 JSON 在浏览器控制台能用,在工具里报错? 控制台里你写的是 JavaScript 对象字面量,规则比 JSON 宽松:允许单引号、尾随逗号、键名不加引号。能在控制台跑通不代表是合法 JSON。

JSON 支持注释吗?有替代方案吗? 标准 JSON 不支持。需要注释的配置场景建议改用 YAML,或者约定一个 _comment 字段放说明文字。

格式化会改变数据吗? 只改空白字符。但要注意上面提到的大整数问题——如果工具内部经过了 JSON.parsestringify,超过安全整数范围的数字会被改写。这类数据建议只做校验、不做格式化。

全部处理都在本地吗? 是。JSON 相关工具都在浏览器里完成解析,接口返回的业务数据、带密钥的配置不会上传到服务器。

文中用到的工具

同类教程