← 返回文章列表

JSON 总是报错?90% 的人栽在这 4 个细节

JSON避坑

JSON 和 JS 对象不是一回事

JSON 是数据交换格式,比 JS 对象字面量严格:键必须双引号、字符串必须双引号、不能写注释、不能有尾逗号。很多报错就是把 JS 对象写法直接搬进了 JSON。

高频错误清单

  • 尾逗号:[1, 2, 3,] 末尾多一个逗号;
  • 单引号:{'name': 1} 应改成双引号;
  • 键没加引号:{name: 1} 必须写成 "name";
  • 注释:// 和 /* */ 都不合法。

快速排查思路

  1. 看报错里的行号列号,多数解析器会直接指出出错位置;
  2. 检查报错行的上一行:缺逗号或多逗号最常见;
  3. 字符串里的双引号要转义成 ";
  4. 拿不准就先格式化一遍,缩进清楚了再逐段看。

合法与非法写法对照

部分JS 对象字面量合法 JSON
键{name: 1}{"name": 1}
字符串'abc'"abc"
尾逗号[1, 2,][1, 2]
注释// 说明不支持
特殊值undefined、NaN只能用 null

安全地解析

// 别直接 parse 不可信输入,包一层错误处理
function safeParse(text) {
  try {
    return { ok: true, data: JSON.parse(text) };
  } catch (e) {
    // e.message 通常带位置,例如 "Unexpected token } in JSON at position 42"
    return { ok: false, error: e.message };
  }
}

// 命令行校验与格式化(jq)
// jq . data.json     → 校验并美化输出
// jq -c . data.json  → 压缩为单行

开发时格式化(2 空格缩进)方便读,传输时压缩减体积。含敏感数据的 JSON 尽量用本地工具处理,别贴到不靠谱的在线服务。另外留意两点:带 UTF-8 BOM 的文件直接解析会报错,要先剥掉;超过 2^53 的大整数 ID 和金额用字符串传,否则 JS 数字会丢精度。

JSON、YAML、TOML 怎么选

  • JSON:机器间交换的事实标准,不支持注释和多行字符串,适合 API 和程序生成的配置;
  • YAML:可读、支持注释,适合人维护的配置,但缩进敏感、隐式类型坑多;
  • TOML:语义明确、不易歧义,适合项目配置(如 Cargo.toml、pyproject.toml)。

几个常被问到的问题

格式化和压缩会改数据吗?不会,只动空白和缩进。重复键以哪个为准?解析时通常取最后一个,容易埋雷,尽早发现。JSON 和 JSON5 什么区别?JSON5 允许注释、单引号和尾逗号,但通用解析器不认,别把它当 JSON 用。

动手试试:JSON 格式化