你肯定被这种东西坑过:配置里加一行 // 临时注释,浏览器 JSON.parse 就抛 Unexpected token /。这不是 JSON 写错——这其实是 JSON5 写法,而浏览器只认严格 JSON。这篇讲清 JSON 和 JSON5 的核心差异,以及 Piick JSON 格式化工具 怎么用 tolerant mode 帮你兼容两种写法。

JSON 和 JSON5 到底有什么区别?

JSON 是 JSON5 的子集。JSON5 在 JSON 基础上放宽了 6 条规则:

  • 支持 // 单行注释和 /* */ 块注释
  • 字符串可以用单引号包,不限于双引号
  • 对象和数组末尾允许多余的逗号(trailing comma)
  • key 可以不加引号(只要是合法标识符)
  • 数字支持十六进制(0x1A)、InfinityNaN
  • 字符串支持多行(行分隔符会被插入换行)

普通 JSON 一个都不接受。这套规则最早由 JSON 之父 Douglas Crockford 提议,后来 JSON5 标准正式落地。但截至今天,浏览器内置 JSON.parse 仍然只认严格 JSON——标准改了,引擎没跟。

JSON5 解决了哪些真实问题?

最痛的两个:注释和尾逗号。配置文件要写三五行注释解释字段含义,标准 JSON 不允许;Git 版本对比时,尾部逗号的增删会让整段 diff 抖动(每加一项都改两行)。package.json 不直接用 JSON5,是因为 npm 工具链只认严格 JSON;但你自己的配置文件、mock 数据、草稿,完全可以用 JSON5,只要最后用工具转回严格 JSON。

浏览器原生 JSON.parse 为什么不够用?

JSON.parse() 只认规范 JSON。注释、单引号、尾逗号都会立刻抛 SyntaxError,而且错误信息只告诉你 Unexpected token,不说在第几行第几列,debug 只能二分查找。在 Piick JSON 格式化工具 里勾选 tolerant mode,工具会自动剥掉注释、转单引号为双引号、删掉尾逗号,然后按标准 JSON 格式化。

Piick 怎么用 tolerant mode 帮你兜底

整个流程在浏览器本地完成,数据不上传:

  1. 把 JSON5 字符串粘到输入框
  2. 勾选 tolerant mode 开关
  3. 点「格式化」,工具先把 JSON5 转成标准 JSON,再用 2/4/tab/最小化四种 indent 输出
  4. 错误信息会精确显示行号和列号,不用二分查找
  5. 一键复制结果,粘到任何严格的 JSON 解析器都能用

简单说:tolerant mode 让你用 JSON5 的方式写,用 JSON 的方式交付——两边都不得罪。下次写 mock 数据再也不用跟尾逗号较劲。


现在就打开 Piick JSON 格式化工具 试试 tolerant mode,把 JSON5 草稿直接粘进去看效果。