JSON 常见错误排查大全:10 个让你排查到凌晨的 Bug
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
undefined、NaN、Infinity 都不是合法的 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 解析失败时,按以下顺序排查:
- 把 JSON 粘贴到 yyjson.top ,格式化工具会直接指出错误位置
- 用
console.log(jsonString.length)检查是否有不可见字符导致长度异常 - 检查首尾是否有多余的引号包裹(如
"{\"name\":\"张三\"}"需要先 parse 一次外层字符串) - 如果数据来自 API,在浏览器 Network 面板中复制原始响应,不要从 console 复制(console 可能做了美化处理)
遇到 JSON 格式错误?直接粘贴到这里排查
打开 JSON 格式化工具