json-repair 是修复豆包等大模型返回不规范 json 的最直接有效方案,可自动修复单引号、缺引号、尾随逗号、注释、括号不全等问题,并支持提取混合文本中的 json 片段。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

json-repair 是目前处理豆包(Doubao)等大模型返回不规范 JSON 最直接有效的方案。它不是“将就解析”,而是主动修复语法错误,把残缺、带注释、混用单引号、尾随逗号、括号不全的字符串,真正转成合法 JSON。
为什么不能只靠 try/catch + replace?
豆包输出的“类 JSON”往往不是简单替换能解决的:比如 "{'name': 'Alice', 'age': 20}" 中单引号嵌套、键无引号、字符串内含换行或中文标点;又比如返回文本包裹 JSON:"请看结果:{"code": 0, "data": [..."。硬用 replace() 或 ast.literal_eval() 容易崩溃或误判——前者漏修深层结构,后者不支持注释、尾逗号、JS 风格键名。
用 repair_json() 一步修复再解析
安装后直接调用最简接口即可覆盖绝大多数豆包输出场景:
pip install json-repair
repair_json() 默认返回修复后的字符串,配合 json.loads() 使用最稳妥:
- 它会自动清理注释(
//和/* */)、补全缺失的引号和括号、修正布尔值大小写(True→true)、删除尾随逗号 - 对混合内容(如“回复如下:{...”)也能提取并修复最外层 JSON 片段
- 支持非拉丁字符(中文、emoji),无需额外 decode 处理
- 不修改原始语义,只做最小必要修复,避免字段名被意外重命名
示例:
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
from json_repair import repair_json
import json
<p>bad = '你好,这是结果:{"name": "张三", "tags": ["a", "b",], "active": True}'
fixed = repair_json(bad) # → '{"name": "张三", "tags": ["a", "b"], "active": true}'
data = json.loads(fixed) # ✅ 成功解析为 dict</p>
json_repair.loads() 替代原生 json.loads()
如果你希望无缝接入现有解析逻辑,直接用 json_repair.loads() 替换所有 json.loads() 调用:
- 行为完全一致:输入字符串,输出 Python 对象
- 内部已封装修复逻辑,失败时仍抛
json.JSONDecodeError,不影响异常处理流程 - 比手动先
repair_json()再json.loads()少一次字符串序列化/反序列化,略快
注意:不要在高并发流式响应中直接传未截断的 chunk 给它——repair_json() 需要看到完整结构才能判断括号是否闭合,建议攒够一个逻辑 JSON 单元(如以 { 开头、有明确结尾)再送入。
容易忽略的边界:空值、null 字段、嵌套字符串里的 JSON
豆包有时会返回 "data": "{'id': 1}" 这种「JSON 字符串里还套着脏 JSON」的情况。此时 repair_json() 只修外层,不会递归进字符串值里。你需要:
- 先用
json_repair.loads()解析顶层 - 对疑似含 JSON 的字段(如
data、content),单独取出再调一次repair_json() - 别依赖
return_objects=True试图一步到位——它只作用于最外层,对字段值不做深度修复
真正难啃的,从来不是语法错位,而是模型把结构意图藏在自然语言里又没划清边界。修完 JSON 后,务必校验关键字段是否存在、类型是否符合预期——repair_json() 让你拿到可解析的字符串,但不保证业务逻辑正确。










