返回

JSON 修复

格式化

正在载入

正在加载工具

工具代码会在打开时按需载入,请稍候。

本工具的全部运算都发生在你的浏览器中,输入内容不会发送到任何服务器。

关于这个工具

使用本地 Web Worker 中的 jsonrepair 3.15.0 修复复制的配置、API 示例或生成的 JSON 片段。工具可补充缺失标点、为键名加引号、转换单引号,并移除注释或尾逗号。保留原始输入与修复文本以便对照,同时显示一个精确的整体变化区间。语法修复只是推测:能够解析并不代表符合原意、找回缺失内容或通过 Schema 校验。请检查每个结果,再复制或下载。

常见用途

  • 将带注释、单引号或无引号键名的小型类 JSON 配置整理为严格 JSON。
  • 查看截断响应补上了哪些引号、方括号或花括号,再向数据来源索取完整内容。
  • 把 AI 生成的 JSON 片段与修复建议对照,保留原文以便复核。
  • 修复数字周围的标点,同时保留大整数标识符、小数和指数的原始写法。
  • 检查 JSONP 包装、Markdown 代码围栏或逐行记录转换是否符合实际用途。

使用方法

  1. 1.粘贴原始文本,或加载示例。输入上限为 200,000 个 UTF-8 字节。 运行“修复 JSON”。本地工作线程在限制内尝试修复;不再需要时可取消。
  2. 2.阅读警告,并对照原文和修复结果。已合法的 JSON 在通过安全检查后原样返回。 检查变化区间。偏移量从 0 开始,以 UTF-16 代码单元计数,结束位置不包含在内;一个表情符号可能占两个单位。区间内可能含有多处修改之间未变化的文本。
  3. 3.勾选已检查确认框后,才能使用复制和下载。确认内容后复制或下载修复文本。修改输入会使旧结果失效,导出前需重新修复。

可执行的输入与输出示例

移除注释与尾逗号

{
  // copied config
  "name": "Ada",
  "enabled": true,
}
{
  
  "name": "Ada",
  "enabled": true
}

注释和最后一个逗号被移除。示例中的空行与其余排版按实际结果保留,工具不会重新格式化输出。

为键名和单引号字符串加双引号

{name: 'Ada', city: '東京'}
{"name": "Ada", "city": "東京"}

键名和字符串改用 JSON 双引号,日文内容保留。这里不会执行 JavaScript 对象字面量。

补上缺失逗号

{"a": 1 "b": 2}
{"a": 1, "b": 2}

两个属性之间加入逗号。请确认原文确实想表达两个独立字段。

闭合截断的嵌套值

{"user":{"name":"Ada","roles":["reader","editor"
{"user":{"name":"Ada","roles":["reader","editor"]}}

仅补上闭合标点,不会找回可能被截断的其他角色或字段。

闭合截断字符串

{"message":"Hello
{"message":"Hello"}

建议结果包含 "Hello",但原句可能更长。请检查截断情况,不要把输出视为恢复的数据。

修复时保留数字写法

{id: 9007199254740993, price: 1.2300, small: 1e-400, sign: -0,}
{"id": 9007199254740993, "price": 1.2300, "small": 1e-400, "sign": -0}

大整数、小数尾零、指数和负零均按原始文本保留。下游 JavaScript 解析器仍可能损失精度。

合法 JSON 原样保留

{
  "id": 9007199254740993,
  "price": 1.2300,
  "small": 1e-400,
  "sign": -0,
  "escaped": "\u0061"
}
{
  "id": 9007199254740993,
  "price": 1.2300,
  "small": 1e-400,
  "sign": -0,
  "escaped": "\u0061"
}

输出与输入完全相同,包括缩进、数字词元和反斜杠 u 转义,无需变化区间。

移除 Markdown 代码围栏

```json
{"ready": true,}
```
{"ready": true}

移除围栏和尾逗号。展示结果开头与结尾的换行也是实际修复文本的一部分。

移除 JSONP 包装但不运行

callback({"ok":true});
{"ok":true}

回调名、括号和分号作为文本被移除,不会调用回调。请确认提取内部值符合你的意图。

转换 Python 风格常量

{'active': True, 'deleted': False, 'value': None}
{"active": true, "deleted": false, "value": null}

True、False、None 转为 true、false、null,同时转换单引号。这是文本建议,不执行 Python。

将逐行记录包成数组

{"id":1}
{"id":2}
[
{"id":1},
{"id":2}
]

两条记录变成一个 JSON 数组。请检查这种结构变化;专门的逐行处理可使用 JSON Lines 工具。

复核有歧义的裸词

{"state": pending}
{"state": "pending"}

pending 被推测为字符串。工具无法知道原意是否为缺失值、标识符或其他状态。

按 UTF-16 计算偏移量

{"emoji":"😀", unquoted: true,}
{"emoji":"😀", "unquoted": true}

表情符号不变,占两个 UTF-16 代码单元。整体变化从它之后开始,请不要把偏移量理解成字节数。

拒绝解码后重复的键

{"a":1,"\u0061":2}
{
  "error": "duplicate"
}

这里只显示诊断代码,不产生修复输出。两个键名都解码为 a,必须明确决定应采用哪个值。

拒绝猜测指数

{"value":1e}
{
  "error": "numericChange"
}

这里只显示诊断代码,不产生修复输出。把 1e 补成 1e0 会凭空补充数字词元的一部分,因此被阻止。

用 null 建议填补缺失值

{"value":}
{"value":null}

修复库建议用 null 填补缺失值。这是推测的占位值,不是恢复了原值;接受前请核对来源。

重复逗号可能改变数组嵌套

[1,,2]
[
[1],2
]

对此有歧义的输入,修复库建议生成包含 [1] 和 2 的外层数组,换行与展示结果完全一致。它并非只删除重复逗号或补上缺失元素。原本的结构无法确定,接受建议前请检查并修正嵌套关系。

常见错误与复核要点

  • 重复键错误也可能来自同一键名的不同转义写法。确认正确值后,再移除或重命名冲突属性。
  • 数字变化错误是一项保护措施。应依据数据来源修正错误数字,不要默认猜出的指数或小数就是正确值。
  • 只含空白的文本也会触发空输入错误。请先粘贴 JSON 值或类 JSON 片段。
  • 字节限制按 UTF-8 计算,不按可见字符数计算。中文、日文和表情符号可能比 ASCII 更快达到上限。
  • 修复完成前就可能触发深度错误。应减少过深嵌套,而不是反复提交同一文档。
  • 语法错误表示修复库未能生成可接受结果。请检查未匹配的括号、无效转义和意外的外围文本。
  • 截断字符串修复成功不代表字符串完整。请与原始来源对照。
  • 较大的变化区间可能覆盖多处修改及其间未变化的文本,不能用它计算修改次数。
  • 超时或取消后没有可导出的结果。可尝试较小片段,并检查省略的上下文。
  • 原始的错误 Unicode 无法忠实导出为 UTF-8。应在来源处修正,不要与字面反斜杠加 u 的转义序列混淆。

限制与说明

  • 输入上限为 200,000 个 UTF-8 字节,输出上限为 500,000 个 UTF-8 字节,嵌套最多 64 层。浏览器会在 5 秒后终止仍在运行的修复线程;本工具不处理流式或大型文件。 原始文本中未配对的 UTF-16 代理项会被拒绝,因为 UTF-8 下载会替换它。已经转义的 "\uD800" 等序列按文本保留;下游系统处理 Unicode 的方式可能不同。
  • 语法修复无法找回遗漏记录、判断业务含义或证明 API 数据正确。补上结束引号的截断字符串仍可能缺少内容。 本工具不是完整 JSON5 解析器、Schema 校验器或通用 JavaScript 解释器。部分错误输入仍不受支持,不会产生修复输出。 未知或不完整的转义、undefined、省略号,以及 [2/3]、[true&&false]、{x:true?false:null} 等 JavaScript 表达式不在支持范围内。 缺失值可能被补成 null;这只是猜测的占位值,不是恢复的数据。
  • 同一对象中解码后重复的键会被拒绝,包括 "a" 与 "\u0061"。工具不会默默保留最后一个值;不同对象使用相同键名不受此限制。 修复前后会比较数字词元的写法。任何拟议的数字修改、插入或删除都会被拒绝,例如 01、0x10、.5、1. 和未完成的 1e。 9007199254740993、1.2300、1e-400 和 -0 等合法数字写法以文本原样保留。后续 JavaScript 解析器或其他格式化工具仍可能舍入或改写它们。
  • 差异显示基于共同前缀和后缀,只有一个最小包围变化区间,不是逐项修改清单或 JSON 语义差异。区间内未变化的文字也会包含在内。
  • 移除 JSONP 包装、转换 Python 常量、去掉代码围栏、将 NDJSON 包成数组以及为裸词加引号,均可能改变文本解释方式。这些只是待复核的建议,不代表作者原意。 工具不执行 JavaScript 或 JSONP 回调,不解析网址、不联网获取数据,也不把输入写入浏览器存储。仅在你主动操作时复制或下载。

常见问题

修复能恢复所有数据或验证 API 内容吗?

不能。有时可以补上闭合标点或字符串结束符,但无法恢复缺失字节、记录和值。请对照来源检查建议结果;准确性重要时应取得完整响应。 不等于。成功只代表建议结果通过了本工具的语法与安全检查。必填字段、类型、范围和业务规则需要另行验证;已有 Schema 时可使用 JSON Schema 校验器。

重复键、大整数和数字修复如何处理?

已合法且通过检查的 JSON 按原文返回。修复过程中比较并保留数字写法,不通过解析数字再序列化来生成输出。周围语法、注释和空白可能变化;交给其他解析器前请检查精确结果。 不同消费者对重复成员名的处理可能不同,许多会默默保留最后一个值。本工具在解码键名转义后拒绝重复,因此 {"a":1,"\u0061":2} 不会被接受。请自行确认应保留的值。 将 .5 改为 0.5,或把 1e 补成 1e0,都改变了数字词元。本工具拒绝这种数字修改建议,不会猜测,也不会默默把数字改成字符串。

变化区间的偏移量是什么意思?

从 0 开始按 UTF-16 代码单元计数,结束位置不包含在区间内。常见表情符号占两个单位。一个整体区间包围所有变化,因此多处修改之间未变化的文字也可能显示在区间内。

工具会执行代码、上传或保存输入吗?

不会执行代码。修复库可以移除 JSONP 回调包装,并将 True、False、None 改写为 JSON 字面量。这些文本转换仍需检查,因为 JSON 语法无法确定所需含义。 原文留在当前页面内存中,并可随时与结果对照。修复只把它交给本地工作线程,不联网、不求值执行,也不写入浏览器存储。清空工具会移除当前输入和结果。

相关工具