教程

JSON 常见错误大全:原因、示例与修复方法

系统整理 JSON 解析中最常见的引号、逗号、括号、转义字符、非法值、重复键和大整数问题,提供错误示例、正确写法与可靠的排查顺序。

2026-07-1912 分钟

JSON 看起来简单,但一个引号、逗号或反斜杠放错位置,就可能让整个文件无法解析。更麻烦的是,解析器通常只报告它无法继续的位置,那里不一定是真正写错的地方。

这篇指南整理开发、接口联调、日志分析和配置维护中最常见的 JSON 问题。每一类都包含错误原因、错误示例、正确写法和修复建议。你可以先用 JSON 验证器 定位第一个错误;如果输入只是接近 JSON,可以用 JSON 修复工具 生成候选结果,再人工复核。所有处理都在浏览器本地完成。

快速原则:保留原始输入,从第一个错误开始修复;每修一处就重新验证,不要一次性猜测所有修改。

一、先判断你拿到的是不是标准 JSON

合法 JSON 只允许对象、数组、字符串、数字、布尔值和 null。对象的键和字符串必须使用双引号;JSON 不支持注释、undefinedNaN、函数或日期类型。

如果内容来自 JavaScript 源码、日志、Python 字典或配置文件,它可能只是“JSON 风格文本”,并不是真正的 JSON。先确认来源,可以避免用错误的方法修复。

现象常见原因优先检查
Unexpected token非法字符、单引号或未加引号的键错误位置前后的引号与字符
Unexpected end of JSON input缺少括号、引号或数据被截断文件末尾与网络响应是否完整
Expected ',' or '}'属性之间缺少逗号上一行结尾
Bad control character字符串中含未转义换行或制表符反斜杠和原始控制字符
解析成功但值不对重复键、大整数或类型变化数据语义与业务规则

二、属性名或字符串没有使用双引号

标准 JSON 要求对象键和字符串都使用双引号。JavaScript 对象允许单引号和未加引号的键,因此从源码复制对象时经常出现这个问题。

错误示例:

{
  name: 'Alice',
  'role': 'admin'
}

正确写法:

{
  "name": "Alice",
  "role": "admin"
}

不要直接把全文所有单引号替换成双引号。字符串内部可能包含撇号或已转义字符,盲目替换会制造新的错误。更可靠的做法是让修复器识别字符串边界,再检查转换结果。

三、对象属性或数组元素之间缺少逗号

解析器可能把错误指向下一行的属性名,但真正的问题往往是上一项末尾缺少逗号。

错误示例:

{
  "name": "Alice"
  "active": true
}

正确写法:

{
  "name": "Alice",
  "active": true
}

数组也遵循同样规则:

["red", "green", "blue"]

遇到 Expected ',' 时,先看报错位置的前一个完整值,而不只是盯着被标红的字符。

四、对象或数组末尾多了逗号

JavaScript 和部分配置格式允许尾逗号,但标准 JSON 不允许最后一个成员后继续保留逗号。

错误示例:

{
  "name": "Alice",
  "active": true,
}

正确写法:

{
  "name": "Alice",
  "active": true
}

数组末尾的逗号同样需要删除。可以用 JSON 美化器 再次解析并统一缩进,确认结果已经是标准 JSON。

五、缺少右括号、右方括号或结束引号

Unexpected end of JSON input 通常表示解析器已经读到文本末尾,但对象、数组或字符串仍未结束。也有可能是网络响应、日志或复制内容本身被截断。

错误示例:

{
  "user": {
    "name": "Alice",
    "tags": ["admin", "editor"]
}

上面的外层对象还缺少一个右大括号。修复后的结构是:

{
  "user": {
    "name": "Alice",
    "tags": ["admin", "editor"]
  }
}

如果数据来自接口,不要看到缺括号就直接补齐。先检查 Content-Length、请求状态、代理日志或原始文件,确认数据是否完整。工具可以补结构符号,却无法恢复已经丢失的字段和值。

六、字符串包含非法转义字符

JSON 使用反斜杠表示转义。双引号、反斜杠、换行和制表符分别需要写成 \"\\\n\t。Windows 路径和正则表达式最容易出错。

错误示例:

{
  "path": "C:\new\reports",
  "message": "He said "hello""
}

正确写法:

{
  "path": "C:\\new\\reports",
  "message": "He said \"hello\""
}

还要注意:字符串不能直接跨行。如果内容中确实需要换行,应使用 \n,而不是在双引号之间插入真实换行。

七、JSON 中包含注释

标准 JSON 不支持 // 单行注释或 /* ... */ 块注释。下面的内容对 JavaScript 可能很熟悉,但不是合法 JSON:

{
  // Production API endpoint
  "apiUrl": "https://api.example.com"
}

正确做法是移除注释,或把确实需要保留的说明变成明确字段:

{
  "description": "Production API endpoint",
  "apiUrl": "https://api.example.com"
}

不要使用简单正则删除所有 // 后面的内容,否则可能误删 https:// URL。修复过程必须先识别字符串边界。

八、使用了 JSON 不支持的值

JSON 中的布尔值和空值只能写成小写的 truefalsenull。以下值都不是标准 JSON:

  • • Python 风格的 TrueFalseNone
  • • SQL 或其他系统中常见的 NULL
  • • JavaScript 的 undefinedNaNInfinity
  • • 日期对象、函数或正则表达式

错误示例:

{
  "active": True,
  "nickname": None,
  "score": NaN
}

候选修复:

{
  "active": true,
  "nickname": null,
  "score": null
}

这里不能只做机械替换。NaN 改为 null、字符串还是移除字段,取决于业务约定。语法修复工具可以提出候选结果,最终含义必须由数据所有者确认。

九、一个 JSON 文档中拼接了多个对象

日志系统经常每行输出一个 JSON 对象,这种格式通常叫 NDJSON 或 JSON Lines。多行分别合法,不代表整份文本是一个合法 JSON 文档。

错误示例:

{"id": 1, "status": "ok"}
{"id": 2, "status": "failed"}

如果目标系统需要标准 JSON 数组,应转换为:

[
  {"id": 1, "status": "ok"},
  {"id": 2, "status": "failed"}
]

处理日志时还要确认每一行是否完整,不能仅在首尾添加方括号;对象之间还需要逗号,字符串中的换行也必须正确转义。

十、JSON 被重复编码成了字符串

有时解析成功后得到的不是对象,而是一整段带反斜杠的字符串。这通常表示 JSON 被序列化了两次。

重复编码的结果类似:

"{\"name\":\"Alice\",\"active\":true}"

第一次解析得到字符串,第二次解析才得到对象。正确方案通常是在数据生产端只序列化一次,而不是让每个使用方都额外解析。修复前应确认接口契约:字段本来就要求保存原始 JSON 文本时,字符串形式可能是有意设计。

十一、重复键:语法合法,但结果不可靠

下面的 JSON 可能被解析器接受,却包含两个同名键:

{
  "role": "user",
  "role": "admin"
}

许多解析器会保留最后一个值,但不同语言、库和安全组件的行为可能不同。攻击者甚至可能利用这种差异绕过校验。可靠做法是在数据进入系统时检测并拒绝重复键,再回到数据生产端消除冲突。

因为普通 JSON.parse 解析后已经丢失重复信息,仅检查解析结果可能发现不了问题。高风险数据应使用能够在解析阶段报告重复键的库。

十二、超大整数发生精度丢失

JSON 语法本身允许很大的数字,但 JavaScript 的普通 Number 不能精确表示所有整数。超过 9007199254740991 的订单号、雪花 ID 或数据库主键可能在解析后被改变。

风险示例:

{
  "userId": 9007199254740993
}

更安全的传输方式是把标识符写成字符串:

{
  "userId": "9007199254740993"
}

如果字段需要数学计算,应在生产端和消费端共同约定高精度数字方案。仅把已经丢失精度的结果重新转成字符串,无法恢复原始数字。

十三、一套可靠的 JSON 排查顺序

遇到无法解析的 JSON,可以按以下顺序处理:

  1. 保存原始文本,不要覆盖唯一副本。
  1. 确认输入完整,没有被复制、日志或网络传输截断。
  1. 使用 JSON 验证器 找到第一个错误的位置。
  1. 查看错误位置之前的引号、逗号和括号。
  1. 如果输入来自 JavaScript 或 Python,检查单引号、未加引号的键和非标准字面量。
  1. 每修复一处就重新验证,直到语法通过。
  1. 使用 JSON Diff 对比原始内容和候选结果。
  1. 使用 JSON 树形查看器 检查嵌套结构、类型和关键字段。
  1. 最后验证业务规则、必填字段和数据类型,而不只是确认 JSON.parse 成功。

对于支付、权限、医疗、审计或数据库迁移数据,不应在无人确认时自动修改。工具适合修复明确的语法问题,但不能猜测缺失值或业务含义。

总结

大多数 JSON 解析错误来自双引号、逗号、括号、转义字符和非标准值。最快的办法不是反复试错,而是保留原文、从第一个错误开始、逐步修复并重新验证。

语法通过之后还要继续检查重复键、大整数、数据类型和字段含义。如果需要处理接近 JSON 的输入,可以先使用 JSON 修复工具,再用 JSON 验证器JSON Diff 完成独立复核。

Ene Chen

致力于为开发者提供最佳的 JSON 处理工具

相关文章

更多文章即将发布...

返回博客

相关工具推荐

常见问题

关于跟进更新、选题方向与互动反馈。

如何第一时间看到新文章?

收藏本博客列表页,并在首页与工具聚合页留意指南入口。阅读文章无需注册或邮件订阅。

博客主要写什么?

围绕 JSON 校验、格式化、转换与调试流程,以及 JSON Work 工具更新,与在线工具的本地能力一一对应。

可以建议教程选题吗?

可以。请通过关于页的联系方式或 GitHub 反馈;我们会优先安排贴近真实开发场景的教程。