Skip to main content
CheckTown
开发工具

JSON 修复:修复来自 API 和大模型的损坏 JSON

发布于 阅读约 5 分钟
本文目录

常见的 JSON 错误

JSON 有着严格的语法规则,开发者常常在此栽跟头。一个逗号放错位置、一个未加引号的键,或者最后一个元素后面多出的一个逗号,都会让整个文档失效。标准的 JSON 解析器会彻底拒绝这些错误,只留给你一条错误信息和一个行号——没有任何部分数据,也没有任何修改建议。

最常见的 JSON 错误包括:最后一个属性或数组元素后面多余的逗号、用单引号而非双引号包裹字符串、未加引号的属性键、嵌入数据中的注释(// 或 /* */)、缺失的右方括号或右花括号,以及字符串值中未转义的特殊字符。JSON 修复工具可以自动修正所有这些问题。

JSON 修复的工作原理

JSON 修复工具采用基于解析器的方法,而不是简单的查找替换正则表达式。它逐个字符地读取输入,维护一个状态机来跟踪当前在 JSON 结构中的位置(对象、数组、字符串、值)。当遇到无效语法时,它会根据上下文推断出预期的结构并加以修正。

  • 基于解析器的修正——修复引擎会维护一个解析状态(在对象内、在数组内、在字符串内、等待值),并利用这一上下文来判断正确的修复方式,而不是盲目套用正则表达式模式
  • 方括号与花括号配平——跟踪成对的左右方括号/花括号,在文档末尾自动补上缺失的闭合符号,或将其插入到结构隐含它们应处的位置
  • 引号规范化——将单引号转换为双引号,为未加引号的键补上引号,并正确转义那些会破坏字符串值的特殊字符

免费试用 —— 无需注册

修复 JSON →

LLM 输出与被截断的 JSON

大语言模型经常生成格式错误的 JSON。它们可能在达到 token 上限时于对象中途截断输出,在深层嵌套结构中遗漏闭合括号,在最后一个属性后添加多余的逗号,或在 JSON 块中夹带解释性注释。JSON 修复能够处理所有这些 LLM 特有的问题。

  • 被截断的输出——当 LLM 因 token 上限在对象中途停止生成时,修复工具会按正确的顺序闭合所有未关闭的结构(字符串、数组、对象),从而将残缺的输出补全为有效的 JSON
  • Markdown 代码围栏——LLM 常将 JSON 包裹在 ```json...``` 代码块中。修复工具会在处理前剥除这些围栏,并对带围栏和不带围栏的 JSON 都能透明处理
  • 混合内容——LLM 有时会在 JSON 块前后输出文本,或夹带行内注释。修复工具会只提取出其中的 JSON 部分,并修正其内部的任何语法问题

常见问题

JSON 修复会导致破坏性改动吗?

JSON 修复在设计上是保守的——它只修正语法错误,绝不修改数据值。多余的逗号会被删除,缺失的括号会被补上,单引号会变成双引号,但实际的数据(字符串、数字、布尔值、数组、对象)保持不变。修复后的输出在语义上与作者本来的意图完全一致。

修复工具如何处理编码问题?

JSON 要求使用 UTF-8 编码。修复工具会处理常见的编码问题,例如文件开头的 BOM(字节顺序标记)、无效的转义序列(用 \x 而非 \u 表示十六进制),以及字符串中未转义的控制字符。它会将这些内容规范化为符合 JSON 规范的有效 UTF-8。

深层嵌套的 JSON 能被修复吗?

可以。基于解析器的方法能够处理任意深度的嵌套,因为它维护着一个存放未关闭结构的栈。无论输入是 3 层还是 30 层嵌套,修复引擎都会跟踪每一层,并正确闭合任何未关闭的结构。而这恰恰是基于正则表达式的方法完全失败之处。

相关工具