JSON 常见错误排查大全:10 个让你排查到凌晨的 Bug

分类:调试技巧 · 阅读约 10 分钟

JSON 看似简单,只有 6 种数据类型和 3 条语法规则。但正是这种「看起来简单」让开发者粗心大意,在凌晨 debug 时对着一个逗号发愣。本文整理了 10 个最高频的 JSON 错误,每个都附上错误示例和正确写法。

错误 1:尾部逗号(Trailing Comma)

对象或数组的最后一个元素后面多写了一个逗号。这是排名第一的 JSON 错误。

{"name": "张三", "age": 30, }   ← 最后一个逗号
{"name": "张三", "age": 30}

错误 2:单引号包围字符串

从 JavaScript 代码或 Python dict 复制来的数据常犯这个错。JSON 标准只允许双引号

{'name': '张三'}   ← 单引号 JSON 非法
{"name": "张三"}

错误 3:注释残留

JSON 标准不支持注释。从 JSON5、MongoDB shell 或带注释的配置文件复制数据时要小心。

{
  // 用户基本信息
  "name": "张三"   ← 注释导致 JSON.parse 报错
}
{"name": "张三"}

错误 4:未转义的双引号

字符串内部的双引号必须用反斜杠转义。

{"message": "他说:"你好""}   ← 内部双引号导致解析中断
{"message": "他说:\"你好\""}

错误 5:换行符未转义

JSON 字符串不允许跨行。多行文本中的换行必须用 \n 表示。

{"bio": "第一行
第二行"}   ← 文字内的真实换行导致解析失败
{"bio": "第一行\\n第二行"}

错误 6:undefined 和 NaN

undefinedNaNInfinity 都不是合法的 JSON 值。在 JavaScript 中 JSON.stringify 会将这些值转为 null 或直接丢弃。

{"score": NaN, "data": undefined}
{"score": null, "data": null}

错误 7:键名未加引号

JavaScript 对象字面量允许键名不加引号,但 JSON 必须加。

{name: "张三"}   ← 键名没有引号
{"name": "张三"}

错误 8:大整数精度丢失

JavaScript 的 Number 类型无法安全表示超过 253-1 的整数。解析后可能得到错误的值,且没有任何报错——这是最隐蔽的错误。

{"userId": 9007199254740993}   // 解析后变成 9007199254740992
{"userId": "9007199254740993"}  // 以字符串传输

错误 9:重复键名

JSON 标准没有禁止重复键名,但大多数解析器只保留最后一个值,前面同名键的值静默丢失

{"name": "张三", "name": "李四"}   // 最终 name = "李四","张三" 丢失
{"nameList": ["张三", "李四"]}  // 如需多值,使用数组

错误 10:BOM 头(Byte Order Mark)

某些 Windows 编辑器会在 UTF-8 文件开头插入不可见的 BOM 字符(U+FEFF)。JSON.parse 遇到 BOM 直接报错,而你看不到任何异常字符。

[BOM]{"name": "张三"}   ← 肉眼看不到的 U+FEFF
使用编辑器以「UTF-8 without BOM」格式保存

快速排查流程

遇到 JSON 解析失败时,按以下顺序排查:

  1. 把 JSON 粘贴到 yyjson.top ,格式化工具会直接指出错误位置
  2. console.log(jsonString.length) 检查是否有不可见字符导致长度异常
  3. 检查首尾是否有多余的引号包裹(如 "{\"name\":\"张三\"}" 需要先 parse 一次外层字符串)
  4. 如果数据来自 API,在浏览器 Network 面板中复制原始响应,不要从 console 复制(console 可能做了美化处理)

遇到 JSON 格式错误?直接粘贴到这里排查

打开 JSON 格式化工具