JSON 为什么会报错:最容易踩中的 7 条规则
JSON 是 JavaScript 对象语法的一个子集,这也正是它常常让人意外的原因。能够顺利粘贴进 .js 文件的内容,
交给 JSON 解析器却往往直接被拒绝。报错原因几乎都落在下面七条之中。
1. 尾逗号
出现频率最高。JSON 不允许右括号或右花括号前保留多余的逗号。
{
"name": "Tools",
"tags": ["json", "formatter",],
}
上面两处逗号在 JavaScript 里合法,在 JSON 里非法。删掉 "formatter" 后面以及数组后面的那两个逗号。
2. 单引号
字符串必须使用双引号,键名和值都一样。
{ 'name': 'Tools' }
3. 键名没有加引号
{ name: "Tools" } 是合法的 JavaScript 字面量,但不是合法 JSON。每个键名都必须用双引号包裹。
4. 注释
JSON 不支持任何注释语法,// 和 /* */ 都会失败。如果某个配置文件确实需要写注释,那它其实是
JSON5、JSONC 或 YAML,而不是 JSON,严格解析器不会接受。常见做法是把说明放进一个自定义字段,
例如 "_comment"。
5. NaN、Infinity 与 undefined
JSON 没有表示这三个值的方式。请改写为 null;如果它本身只是一个标签,就加引号变成字符串。
用不加处理的序列化方法导出 JavaScript 对象时,这个问题非常常见。
6. 不合法的数字写法
前导零(007)和省略整数部分的小数点(.5)都不合法,0.5 与 7 才是合法的。看起来像日期的
2026-09-28 同样不合法,必须写成带引号的字符串,因为 JSON 里根本没有日期类型。
7. 未转义的控制字符
字符串内部不允许出现真正的换行,必须写成 \n,制表符同理。另外,带 UTF-8 字节顺序标记(BOM)
的文件会在第一个字符处就解析失败,即使文本看上去完全正常——请保存为不带 BOM 的 UTF-8。
定位出错位置
各家解析器的提示文案不同,但都会给出一个可以换算成文档位置的偏移量:
SyntaxError: Expected ',' or '}' after property value in JSON at position 812(V8 引擎)Unexpected token < in JSON at position 0—— 这一条基本意味着你正在解析一段 HTML 错误页, 而不是接口返回的 JSON。请先检查 HTTP 状态码,再看响应体。- Python 会直接给出
line 4 column 12 (char 88)。
JSON 格式化工具在你自己的浏览器里完成解析,并显示报错所在的 行号和列号,通常足以直接指出那个多余的逗号,不必手动计数。
两种看似报错、其实不是的情况
重复键是合法的 JSON。文档能正常解析,多数解析器会静默保留最后一个值,“我的配置项怎么不见了”这类 Bug 往往就来自这里。
嵌套很深或体积很大的文档同样是合法的。解析时出现的栈溢出是解析器的实现限制,不是你的数据有问题。