JSON.parse 没报错就以为 JSON 没问题?其实能解析不等于数据正确。后端返回 {user_id: 123}(key 没引号)你怎么处理?接口要 email 字段,你只看到 mail?这就是 JSON 校验的三层问题——大多数教程只讲第一层。这篇拆清 3 层套路,以及 Piick JSON 格式化工具 怎么精确定位错误位置。

JSON 校验的三种层次

校验分三层,每层解决不同问题:

  • 语法层:字符串是不是合法 JSON,引号、逗号、括号都对。JSON.parse 默认做这个。
  • 结构层:是否符合预定义 schema——user 是不是对象、tags 是不是数组、必填字段有没有。JSON Schema 是这一层的事实标准。
  • 语义层:值是不是有意义——status 是不是在合法枚举内、age 是不是 0-150 之间、email 格式对不对。这一层靠业务代码,或 Zod、Ajv 这类库。

90% 的 bug 都出在后两层。语法层只是个入门门槛。

语法正确不等于数据正确

举个真实场景:接口要求返回 { "code": 0, "data": { "userId": 123 } },实际却返回 { "data": { "userid": 123 } }——大小写错了。JSON.parse 通过,前端读 userId 拿到 undefined,界面显示成空白。这种 bug 在生产环境特别难查。

解决办法:用 JSON Schema 生成 TypeScript 类型,或在请求层做 schema 校验。把 schema 当成接口契约,不符合就立刻打回,而不是等运行时报错。

常见 5 个 JSON 错误及排查

  1. 尾随逗号 {"a":1,} → 删掉最后那个逗号,或用 Piick JSON 格式化工具 的 tolerant mode 自动剥
  2. 单引号字符串 {'a':1} → 全局替换为双引号,或 tolerant mode 自动转
  3. key 没引号 {a:1} → 给 key 加双引号
  4. 注释残留 // xxx → 删注释,或 tolerant mode 自动剥
  5. BOM 头 {"a":1} → 保存时选 UTF-8 无 BOM

排查要点:别用肉眼数括号,直接用工具的「显示行号」功能。

校验完后怎么快速定位错误位置

JSON.parse 报错只说 Unexpected token,不说在哪。Chrome DevTools、Postman、VS Code 插件都能给出行号,但都要手动复制粘贴。

更精确的是 Piick JSON 格式化工具——它直接读 V8 报错里的 position N,换算成行号 + 列号显示在错误条上。粘一个报错的 JSON 进去,直接看到第几行第几列错在哪。Schema 校验起步可以查 JSON Schema 官方实现列表


现在就打开 Piick JSON 格式化工具 粘一段 JSON 进去,试试它给的精确错误位置。