📋
← 返回教程列表

常见的 JSON 语法错误以及如何使用校验器修复它们

· 标签: json, json-errors, json-validation, json-syntax, debugging, developer-tips

常见的 JSON 错误

JSON 严格的语法规则意味着即使一个字符放错位置,也可能破坏整个文档。了解最常见的 JSON 错误可以帮助你更快地调试,并避免重复犯同样的错误。以下是开发者最常遇到的问题,每个都附有清晰的解释和修复方法。

1. 尾部逗号

错误: 对象或数组末尾出现 Unexpected token

在 JavaScript 对象和数组中允许尾部逗号,但在 JSON 中严格禁止

无效的 JSON:

{
  "name": "Alice",
  "age": 30,
}

修复方法: 移除最后一项之后的逗号。

{
  "name": "Alice",
  "age": 30
}

带尾部逗号的数组:

// Invalid
[1, 2, 3,]

// Valid
[1, 2, 3]

2. 键周围缺少引号或引号不正确

错误: 出现 Unexpected identifierExpected double-quoted property name

JSON 要求所有对象键都必须用双引号包裹。单引号和未加引号的键都是无效的,尽管它们在 JavaScript 中可以使用。

无效的 JSON:

{
  name: "Alice",
  'occupation': "Engineer"
}

修复方法: 始终用双引号包裹键。

{
  "name": "Alice",
  "occupation": "Engineer"
}

3. 字符串值使用单引号

错误: 出现 Unexpected identifierUnterminated string

与键一样,JSON 中的字符串值也必须使用双引号。单引号无效。

无效的 JSON:

{ "greeting": 'Hello, world!' }

修复方法: 将单引号替换为双引号。

{ "greeting": "Hello, world!" }

提示: 如果字符串中包含双引号,请用反斜杠进行转义:"He said, \"Hello\""

4. 未转义的特殊字符

错误: 出现 Unexpected tokenInvalid character

JSON 字符串中某些字符必须进行转义:双引号(")、反斜杠(\)和控制字符。

无效的 JSON:

{
  "path": "C:\Users\Documents\file.json",
  "quote": "He said "hello""
}

修复方法: 正确转义反斜杠和双引号。

{
  "path": "C:\\Users\\Documents\\file.json",
  "quote": "He said \"hello\""
}

JSON 转义序列完整列表

| 序列 | 表示 | |----------|-----------| | \" | 双引号 | | \\ | 反斜杠 | | \/ | 正斜杠 | | \b | 退格 | | \f | 换页 | | \n | 换行 | | \r | 回车 | | \t | 制表符 | | \uXXXX | Unicode 字符(例如 é 表示 e) |

5. 无效的数字格式

错误: 出现 Unexpected numberInvalid number

JSON 对数字的格式有特定规则:

  • 不允许前导零(01 无效)
  • 仅数字 0 允许单个前导零
  • 数字不能有结尾的小数点(10. 无效)
  • 不支持十六进制、八进制和二进制格式

无效的 JSON:

{
  "invalid1": 01,
  "invalid2": 10.,
  "invalid3": 0xFF,
  "invalid4": 1,000
}

修复方法:

{
  "valid1": 1,
  "valid2": 10.0,
  "valid3": 255,
  "valid4": 1000
}

6. 无效的值:undefined、NaN、Infinity

错误: undefinedNaNInfinity 会触发 Unexpected token

JavaScript 有一些在 JSON 中没有对应形式的值。它们会导致解析错误:

无效的 JSON:

{
  "undefinedVal": undefined,
  "notANumber": NaN,
  "infinity": Infinity
}

修复方法: 替换为有效的 JSON 值,或使用某种约定。

{
  "undefinedVal": null,
  "notANumber": null,
  "infinity": 1.7976931348623157e+308
}

7. 多余逗号或缺失逗号

错误: 出现 Expected commaUnexpected token

JSON 中的逗号必须分隔每个键/值对和数组元素,但不能出现在最后一项之后。

缺失逗号(无效):

{
  "name": "Alice"
  "age": 30
}

修复方法: 添加缺失的逗号。

{
  "name": "Alice",
  "age": 30
}

8. 深层嵌套结构问题

错误: 出现 Maximum call stack size exceeded 或解析器超时

虽然这不是语法错误,但深层嵌套的 JSON(10 层以上)可能会导致性能问题,并使调试变得极其困难。

有问题的结构:

{
  "level1": {
    "level2": {
      "level3": {
        "level4": {
          "level5": {
            "level6": {
              "value": "too deep"
            }
          }
        }
      }
    }
  }
}

更好的方法: 将结构扁平化,或使用引用。

{
  "users": {
    "alice": { "role": "admin" }
  },
  "permissions": {
    "admin": ["read", "write", "delete"]
  }
}

9. 缺少开括号或闭括号

错误: 出现 Expected ',' or '}'Unexpected end of JSON input

不匹配的花括号和方括号是 JSON 错误的常见来源,尤其是在大型或手写的 JSON 文件中。

无效的 JSON:

{
  "name": "Alice",
  "items": [1, 2, 3
}

修复方法: 确保每个 { 都有对应的 },每个 [ 都有对应的 ]

{
  "name": "Alice",
  "items": [1, 2, 3]
}

专业提示: 正确地缩进你的 JSON,以便直观地匹配开括号和闭括号。JSON 格式化工具可以自动完成这项工作。

如何有效调试 JSON 错误

  1. 使用 JSON 校验器 -- 将你的 JSON 粘贴到免费 JSON 校验器中,获得第一个错误的确切行和列。
  2. 增量校验 -- 对于大型文件,一次只校验一个部分,以隔离错误。
  3. 注意复制粘贴带来的瑕疵 -- 不可见字符、智能引号和不间断空格常常从文字处理器或网页中混入。
  4. 检查字符编码 -- 确保你的文件以 UTF-8 保存。其他编码可能产生不可见的错误。
  5. 使用 linter -- ESLint 等带 json 插件的工具能在开发过程中捕获 JSON 错误。

请记住:JSON 解析器通常只报告第一个语法错误。修复它,重新校验,然后重复,直到文档通过。我们的 JSON Formatter & Validator 工具会提供即时、详细的错误消息,以加快这一过程。