约 6 分钟读完 · 更新于 2026-10-21 · 文中每条都能在下面的配套工具里动手验证
RFC 8259 定义的 JSON 只有 6 种合法值——对象、数组、字符串、数字、true/false、null。校验器报错,本质都是「出现了这 6 种之外的东西」。下面 7 种错误覆盖了日常九成的校验失败,每一种都有对应的一行修复。
✗ {"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 天生不满足,硬凑只会持续报错:
从 Windows 记事本、Excel 导出或某些接口拿到的「JSON」,开头常带一个看不见的 BOM(\uFEFF)。校验器会报 Unexpected token,而你肉眼找不到任何问题。修复:重新以「无 BOM 的 UTF-8」保存,或把内容粘进 JSON 格式化工具,让它清理后再校验。另一个高发场景是复制网页代码时带进的零宽空格(\u200B),症状相同,粘进工具同样能现形。
语法校验只保证「能解析」,不保证「数据对」:字段名拼错、类型不对、必填缺失,校验器一律放行。真正要守住数据质量的场景(接口契约、配置下发、数据导入),在语法校验后加一层 JSON Schema——type 管类型、required 管必填、enum 管取值范围。语法错误看报错信息,数据错误看 schema,两层各管各的。
不允许。RFC 8259 的语法定义里没有注释。需要注释的配置请用 JSONC / JSON5 / YAML,或约定一个 "_comment" 字段。写完可以用 JSON 格式化工具验证是否仍是标准 JSON。
多半是运行时替你「宽容」了:JS 的 eval 类解析、部分语言的解码器会接受单引号、尾随逗号或带 BOM 的输入,而标准校验按 RFC 8259 严格执行。能读不代表合法——按标准修,换语言、换库时才不会炸。
先看报错行号,再看它前一个字符:逗号 / 引号类错误几乎都发生在报错位置之前。把内容贴进 JSON 格式化工具,它给出的具体行列号比肉眼逐行扫快得多。
按顺序查三层:① 编码——文件是否带 BOM、HTTP 头声明的 charset 是否与实际一致;② 双重转义——字符串里又套了一层转义的 JSON,需要先解一层再解析;③ 运行时差异——某些解码器对大数、重复键的处理不同。先把内容粘进格式化工具确认语法层没问题,再往下查。