数据 · 阅读约 4 分钟 ·

JSON 无效?几乎所有错误都来自这 7 个失误

末尾逗号、单引号、注释等等:这些小失误会让 JSON 失效。教你快速找到它们,并逐一修复。

“Unexpected token”和“Unexpected end of JSON input”是开发者最常见的报错之一。JSON 是一种严格的格式,比它所源自的 JavaScript 严格得多,几乎所有失败都能归结为少数几种失误。

1. 末尾的逗号

对象或数组最后一项后面的逗号是头号错误。JavaScript 接受它,JSON 标准却不接受。

{"name": "Ana", "age": 31,}   ✗
{"name": "Ana", "age": 31}    ✓

2. 单引号 和 3. 没加引号的键

所有键和字符串都必须用双引号。{name: 'Ana'} 是合法的 JavaScript,却是无效的 JSON,必须写成 {"name": "Ana"}。

4. 注释

JSON 不支持注释。// 和 /* */ 都会报错,从 JSON5 或 JSONC 写的配置文件(比如 VS Code 的设置)里复制内容的人常常因此踩坑。

5. 特殊值 和 6. 未转义的字符

JSON 里没有 undefined、NaN、Infinity 和函数,请用 null 或数字代替。字符串里的双引号要写成 \",反斜杠写成 \\,换行写成 \n。Windows 路径是经典陷阱:"C:\new" 包含的是一个换行符,而不是反斜杠加字母 n。

7. 括号缺失或多余

缺少的 } 或 ] 通常会在输入的最末尾报错,离真正的问题很远。用缩进格式化 JSON,就能一眼看出哪一层坏了。

很难看出来的错误

有些无效的 JSON 在屏幕上看起来完全正常:

  • 弯引号。从文字处理软件、聊天应用或幻灯片里复制的文字,常常用“和”代替直双引号。它们看起来几乎一样,但 JSON 只接受直的 " 字符。
  • 字节顺序标记(BOM)。一些 Windows 编辑器保存文件时会在开头加一个看不见的字符。JavaScript 的 JSON.parse 和 Python 的 json.loads 都会拒绝它,错误指向位置 0。
  • 从网页粘贴过来的不换行空格和其他不可见字符。

有效却仍会引发 bug 的 JSON

Python 的 json.dumps 默认会写出 NaN 和 Infinity,而其他解析器会拒绝它们;传入 allow_nan=False 可以尽早发现。非常大的整数,比如数据库里的 64 位 ID,是有效的 JSON,但在 JavaScript 中超过 9007199254740991 就会丢失精度,所以很多 API 把它们当作字符串发送。大多数解析器允许重复的键,但最后一个值会悄悄胜出。

怎么读错误信息

解析器报告的是它放弃的位置,而不是你出错的位置。漏掉的逗号通常在下一个键的开头被报告,漏掉的右括号则在输入的最末尾被报告。看报告位置的前面一点。

{
  "name": "Ana"
  "age": 31        ← 错误在这里报告(第 3 行)
}                   漏掉的逗号在第 2 行末尾

找到确切位置

4Dev 的 JSON 校验器按照 JSON 标准(RFC 8259)检查你的文本,指出第一个错误所在的行和列,并给出修改建议。它检查的是语法而不是含义:合法的 JSON 对你的应用来说仍可能类型不对或缺少字段。

打开 JSON 校验器

LinkedInXFacebook