JSON 是现在接口返回和配置文件里最常见的数据格式,但它的语法特别严格——多一个逗号、少一个引号、写一行注释,都会直接报错。日常开发中,JSON.parse 失败大概是碰到最多的运行时错误之一。这篇把常见的几类 JSON 格式错误逐个拆开讲,遇到报错的时候对照着查。

最常见的六种 JSON 格式错误

1. 尾随逗号

现象:浏览器报 Unexpected token } in JSON at position N,Node.js 里报 Unexpected token

错误写法:

{
  "name": "张三",
  "age": 28,
}

最后一个属性后面多了一个逗号。这在 JavaScript 对象里没问题,但标准 JSON 不允许。修复:把最后一个逗号删掉。手动拼 JSON 或者从 JS 对象搬过来的时候特别容易留尾逗号。

2. 单引号代替双引号

现象:Unexpected token ' in JSON 或者 Unexpected string

错误写法:

{
  'name': '张三',
  'age': 28
}

JSON 规范要求键名和字符串值都必须用双引号,单引号不行。这是从 JavaScript 习惯搬过来最容易犯的错。修复:把所有单引号换成双引号。

3. 写了注释

现象:报错位置指向 ///* 处。

错误写法:

{
  // 用户信息
  "name": "张三",
  "age": 28 /* 年龄 */
}

JSON 不支持任何形式的注释,这是设计之初就定下来的——JSON 的定位是数据交换格式,不是配置文件。如果你确实需要注释,考虑用 JSON5、JSONC 或者直接用 YAML。修复:把注释全删掉。

4. 键名没有加引号

现象:Unexpected token n in JSON

错误写法:

{
  name: "张三",
  age: 28
}

跟单引号的问题类似,JSON 要求键名必须是双引号包裹的字符串,不能省略。修复:给所有键名加上双引号。

5. 字符串里有未转义的特殊字符

现象:报错位置在字符串中间,或者解析出来的内容被截断了。

常见情况:

  • 字符串里直接写了双引号:"desc": "他说"你好""
  • 换行符直接写在字符串里(JSON 不允许字面换行)
  • 反斜杠没转义:Windows 路径 "C:\Users\test",这里 \U\t 会被当成转义序列

修复:双引号写成 \",换行用 \n,反斜杠写成 \\。路径应该写成 "C:\\Users\\test"

6. 包含 undefined、NaN、Infinity

现象:解析出来值不对,或者 JSON.parse 直接报错。

JSON 只支持 nulltruefalse、数字、字符串、数组和对象。undefinedNaNInfinity 都不是合法的 JSON 值。通常这个问题出在后端序列化时——JSON.stringify 会把 undefined 的字段直接跳过,把 NaN 转成 null,但如果手动拼字符串就可能出问题。

浏览器报错信息怎么读

不同环境报错格式不太一样,但核心信息都是出错位置:

环境报错格式
Chrome / EdgeUnexpected token X in JSON at position 42
FirefoxJSON.parse: expected property name at line 3 column 5
Node.jsUnexpected token X in JSON at position 42

position 是从 0 开始的字符偏移量,拿到这个数字去原文里数到那个位置,基本就能看到问题出在哪。不过要注意,报错位置有时候指向出错字符的下一个位置——比如尾随逗号的问题,报错会指向 } 而不是逗号本身。

如果不想手动数字符,把 JSON 粘贴到格式化工具里,它会直接高亮出错位置,比肉眼看快得多。

用工具快速定位和修复

手动排查比较费眼,尤其 JSON 很长的时候。推荐做法:

  1. 把 JSON 粘贴到 JSON 格化工具的输入框
  2. 工具尝试解析,出错时显示错误信息和出错位置
  3. 根据提示定位到出错的那一行,修改后重新格式化
  4. 确认没有错误后,复制结果使用

格式化的另一个好处是,重新排版后缩进对齐,结构问题(括号不匹配、数组没闭合)会变得很明显。

怎么避免 JSON 格式错误

  • 别手写 JSON:用 JSON.stringify() 序列化对象,不要手动拼字符串
  • 配置文件用 JSON5 或 YAML:如果需要注释和灵活语法
  • 编辑器装校验插件:VS Code 对 .json 文件自带语法检查,保存时标红提示
  • 接口返回先格式化看一眼:联调时养成习惯,拿到返回先格式化检查

常见问题 FAQ

JSON.parse 报 Unexpected token 是什么意思?

说明解析器在某个位置遇到了不该出现的字符。最常见的原因是尾随逗号、单引号、注释或键名没加引号。报错信息里的 position 数字告诉你出错的字符位置,从 0 开始计数,去原文里找到那个位置就能定位问题。

JSON 里能不能写注释?

标准 JSON 不支持任何形式的注释,不能写 // 也不能写 /* */。这是 JSON 作为数据交换格式的设计决定。如果需要注释,可以改用 JSON5、JSONC 或 YAML,它们都支持注释。

为什么 JSON.stringify 的结果拿去 JSON.parse 没问题,手动拼的就不行?

JSON.stringify 会自动处理引号转义、特殊字符、非法值,输出的一定是合法 JSON。手动拼字符串则容易遗漏转义、写错引号、多加逗号。所以需要生成 JSON 的场景,都应该用 JSON.stringify 而不是手动拼接。

有没有办法在编辑器里自动检查 JSON 语法?

VS Code、WebStorm 等主流编辑器对 .json 文件自带语法检查,保存时会标红提示错误位置。也可以装 Prettier 之类的插件,保存时自动格式化和校验。