
当大模型生成json格式的输出时,有时候可能会出现缺少引号,单引号等问题,json-repair 可以很好的解决这个问题
参考了 json-repair 的官方文档以及其他相关资料,整理了这款JSON修复工具的主要用法。下面的表格和示例可以帮助你快速上手。https://pypi.org/project/json-repair/
主要功能/场景 | 核心方法/命令 | 简要说明 |
|---|---|---|
基础字符串修复 | repair_json() | 修复损坏的JSON字符串,返回修复后的字符串。 |
直接解析为对象 | loads() | 修复损坏的JSON并直接解析为Python对象(如字典、列表)。 |
命令行修复文件 | json_repair <文件路径> | 通过命令行工具直接修复文件中的JSON。 |
处理非ASCII字符 | ensure_ascii=False | 确保非拉丁字符(如中文)在输出中保持原样,不被转义。 |
性能优化 | skip_json_loads=True | 在已知输入必然损坏时跳过验证,提升大文件处理速度。 |
pip install json-repair
repair_json这是最核心的函数,用于修复格式错误的JSON字符串。
from json_repair import repair_json
# 示例1:修复缺失引号和单引号的JSON
bad_json_1 = "{ name: 'John' }"
fixed_json_1 = repair_json(bad_json_1)
print(fixed_json_1)
# 输出:{"name": "John"}
# 示例2:修复缺少闭合括号的JSON
bad_json_2 = '{"response": {"intent": "query", "entities": [{"type": "location", "value": "北京"}'
fixed_json_2 = repair_json(bad_json_2)
print(type(fixed_json_2))
# 输出:<class 'str'>
print(fixed_json_2)
# 输出:{"response": {"intent": "query", "entities": [{"type": "location", "value": "\u5317\u4eac"}]}}
loads如果你想跳过"修复字符串->再解析"的步骤,可以直接使用 loads 方法,它一步到位返回Python对象。
import json_repair
# 直接从损坏的JSON字符串解析为Python字典
bad_json = "{'user': {'name': 'Alice', 'age': 25"
data = json_repair.loads(bad_json)
print(data["user"]["name"])
# 输出:Alice
print(type(data))
# 输出:<class 'dict'>
with open('bad-json.json') as f:
fixed = json_repair.load(f)
print(type(fixed))
print(fixed)
# <class 'dict'>
# {'name': 'Michel\n\n阿明'}
默认情况下,json-repair 为了确保兼容性,可能会将非ASCII字符转义。如果你希望保留原字符,可以使用 ensure_ascii=False 参数。
from json_repair import repair_json
bad_json_with_chinese = "{'name':'Michel阿明'}"
fixed_json = repair_json(bad_json_with_chinese)
print(fixed_json)
# 输出:{"name": "Michel\u963f\u660e"}
fixed_json = repair_json(bad_json_with_chinese, ensure_ascii=False)
print(fixed_json)
# 输出:{"name": "Michel阿明"}
当你的JSON损坏内容保存在文件里时,使用命令行工具会非常方便。
cat bad-json.json
"{'name':'Michel
阿明'}" 你好
# 基础用法:修复文件并输出到终端
json_repair bad-json.json
# 直接修改原文件(注意:-i 会覆盖原文件)
json_repair -i bad-json.json
# 修复后保存到新文件,并指定缩进使格式美观
json_repair bad-json.json -o fixed.json --indent 4

在处理非常大的损坏JSON文件时,可以考虑以下参数来提升性能。
from json_repair import repair_json
large_bad_json = "{'name': michael}"
# 跳过JSON验证步骤,直接开始修复
result = json_repair.loads(large_bad_json, skip_json_loads=True)
print(type(result), result)
# <class 'dict'> {'name': 'michael'}
异常处理:始终对修复操作使用 try-except,因为极端情况下可能修复失败。
from json_repair import repair_json, JSONRepairError
try:
result = repair_json(questionable_json_string)
except JSONRepairError as e:
print(f"JSON修复失败: {e}")
result = {} # 提供一个安全的默认值
希望这些示例能帮助你全面地使用 json-repair