人人都遇到过的 7 种 JSON 校验错误(附一行修复法)

JSON 校验失败 90% 落在这 7 种:中文引号、尾随逗号、单引号、注释、裸键、真实换行、非法数字——每种附一行修复,另加报错对照表、BOM 隐形杀手与「校验通过 ≠ 数据正确」的 schema 底线。

约 6 分钟读完 · 更新于 2026-10-21 · 文中每条都能在下面的配套工具里动手验证

JSON 只认 6 种值:先记住这个再排错

RFC 8259 定义的 JSON 只有 6 种合法值——对象、数组、字符串、数字、true/false、null。校验器报错,本质都是「出现了这 6 种之外的东西」。下面 7 种错误覆盖了日常九成的校验失败,每一种都有对应的一行修复。

7 种高频错误,每种一行修复

  1. 中文引号:字符串用了全角引号 “abc” → 全部替换为半角直引号 "abc"(中英文输入法切换是最常见来源)。
  2. 尾随逗号:[1, 2, 3,] 结尾多了一个逗号 → 删掉最后一个逗号。JSON 的数组和对象都禁止尾随逗号。
  3. 单引号:{'a': 1} → JSON 只认双引号,改成 {"a": 1}。
  4. 注释:// 或 /* */ → 标准不允许注释,删掉或挪进文档;确实要注释的配置请换 JSONC / JSON5 / YAML。
  5. 键没加引号:{a: 1} → 对象的键也必须是双引号字符串,改成 {"a": 1}。
  6. 字符串里夹了真实换行:多行文本直接换行 → 换成 \n 转义。JSON 字符串不允许跨行。
  7. 非法数字:前导 0(012)、十六进制(0x1F)、NaN / Infinity → JSON 只有标准十进制数:012 改成 12,NaN 改成 null。
修复前:三处错误
✗ {"name": “张三", "tags": ['a', 'b'], }
         ↑全角引号      ↑单引号    ↑尾随逗号
修复后
✓ {"name": "张三", "tags": ["a", "b"]}

报错信息 → 真正的病灶:一张对照表

校验器给的报错名看起来吓人,其实每个名字都指向一类固定病灶。按这张表反查,比逐行读文件快得多。

报错信息真正的病灶一行修复
Unexpected token '}'它前面那个逗号(尾随逗号)删掉最后一个逗号
Unexpected token '''单引号或全角引号统一改成双引号
Unexpected end of input某个引号 / 括号没闭合从报错位置向前找配对
一开头就报错、内容看不出问题文件开头藏了 BOM(\uFEFF)另存为「无 BOM 的 UTF-8」
Unexpected number裸键、前导 0、十六进制、NaN键加引号,数字改标准写法
Bad escaped character字符串里的 \ 没转义(Windows 路径高发)写成 \\ 或换成正斜杠 /

一行修复法:看报错位置的前一个字符

校验器报错的行列号,指向的是「解析器已经撑不下去」的位置,真正的病灶通常在前一个字符:报 Unexpected token } 就看它前面的逗号,报 Unexpected end of input 就找还没闭合的引号或括号。按这个思路排查,绝大多数错误不需要逐行读。

不是错误,但不该用 JSON 表达

有三种诉求 JSON 天生不满足,硬凑只会持续报错:

  • 要写注释 → 用 JSONC / JSON5 / YAML / TOML,或约定一个 "_comment" 字段。
  • 要表达日期和二进制 → JSON 没有这两种类型;ISO 8601 字符串和 Base64 是「约定」,不是「类型」。
  • 要依赖键的顺序 → JSON 对象的键在语义上无序,依赖顺序请改用数组。

隐形杀手:BOM 与不可见字符

从 Windows 记事本、Excel 导出或某些接口拿到的「JSON」,开头常带一个看不见的 BOM(\uFEFF)。校验器会报 Unexpected token,而你肉眼找不到任何问题。修复:重新以「无 BOM 的 UTF-8」保存,或把内容粘进 JSON 格式化工具,让它清理后再校验。另一个高发场景是复制网页代码时带进的零宽空格(\u200B),症状相同,粘进工具同样能现形。

从 Excel、日志、接口拿到「类 JSON」的正确姿势

  1. 先确定来源的真实格式:Excel 导出的常是 TSV/CSV 而不是 JSON,别硬校验,先转格式。
  2. 接口返回先用开发者工具的 Response 面板看原文,排除代理 / 网关插进来的错误页 HTML。
  3. 粘进格式化工具看报错行列号,配合上面的对照表定位;大文件先截取报错位置前后各 20 行。
  4. 修好后重新整体校验一遍再入库 / 再提交,别修一处就当全对。

校验通过 ≠ 数据正确:schema 才是底线

语法校验只保证「能解析」,不保证「数据对」:字段名拼错、类型不对、必填缺失,校验器一律放行。真正要守住数据质量的场景(接口契约、配置下发、数据导入),在语法校验后加一层 JSON Schema——type 管类型、required 管必填、enum 管取值范围。语法错误看报错信息,数据错误看 schema,两层各管各的。

常见问题

JSON 标准允许注释吗?

不允许。RFC 8259 的语法定义里没有注释。需要注释的配置请用 JSONC / JSON5 / YAML,或约定一个 "_comment" 字段。写完可以用 JSON 格式化工具验证是否仍是标准 JSON。

为什么代码里能解析,校验器却报错?

多半是运行时替你「宽容」了:JS 的 eval 类解析、部分语言的解码器会接受单引号、尾随逗号或带 BOM 的输入,而标准校验按 RFC 8259 严格执行。能读不代表合法——按标准修,换语言、换库时才不会炸。

怎么快速定位第几行错了?

先看报错行号,再看它前一个字符:逗号 / 引号类错误几乎都发生在报错位置之前。把内容贴进 JSON 格式化工具,它给出的具体行列号比肉眼逐行扫快得多。

JSON 校验通过但程序还是解析失败,查什么?

按顺序查三层:① 编码——文件是否带 BOM、HTTP 头声明的 charset 是否与实际一致;② 双重转义——字符串里又套了一层转义的 JSON,需要先解一层再解析;③ 运行时差异——某些解码器对大数、重复键的处理不同。先把内容粘进格式化工具确认语法层没问题,再往下查。

📂

松开以自动格式化

支持 .json / .sql / .csv / .html / .css / .xml / .yaml 文件