有时候保存json文件的时候不注意,
会保存成这样
{
}
{
}
没加逗号,然后也没加[ ]
比如下面这个例子
{
"name": "张三",
"age": 30
}
{
"name": "李四",
"age": 25
}
每个 JSON 对象之间缺少逗号,并且没有用数组包裹起来。这样的文件无法直接通过标准的 JSON 解析库来解析。
可以用下面的脚本解决(简易版)
import json
# 打开原始JSON文件
with open('原文件名.json', 'r') as f:
content = f.read()
# 初始化一个列表来存储修复后的JSON对象
fixed_json = []
# 初始化一个指针,指向当前解析的起始位置
start = 0
while start < len(content):
try:
# 尝试从当前位置开始查找"query"键
query_start = content.find('{', start)
if query_start == -1:
# 如果找不到左大括号,则退出循环
break
# 查找下一个"example"键的位置
# 这里的example是json对象里面的最后一个key
example_start = content.find('"example":', query_start)
if example_start == -1:
# 如果找不到"real_answer"键,则从下一个左大括号开始重新尝试
start = content.find('{', query_start + 1)
continue
# 查找右大括号的位置
obj_end = content.find('}', example_start) + 1
# 提取当前JSON对象的内容
obj_content = content[query_start:obj_end]
obj = json.loads(obj_content)
fixed_json.append(obj)
# 更新start指针到下一个未解析的位置
start = obj_end
except json.JSONDecodeError as e:
# 如果解析失败,则从下一个左大括号开始重新尝试
start = content.find('{', start + 1)
if start == -1:
break
# 将修复后的JSON列表写入一个新文件
with open('新文件名.json', 'w') as f:
json.dump(fixed_json, f, indent=4)
print("修复后的JSON文件已保存为 新文件名.json")
但这样存在很多问题,因为json对象的value里面很可能存在和key一样的字符串或者{ }
可以用下面这个
def fix_json_by_char_analysis(content):
objects = []
depth = 0
obj_start = -1
in_string = False
escape = False
for i, char in enumerate(content):
if char == '"' and not escape:
in_string = not in_string
elif char == '\\' and in_string:
escape = not escape
else:
escape = False
if not in_string:
if char == '{':
if depth == 0:
obj_start = i
depth += 1
elif char == '}':
depth -= 1
if depth == 0 and obj_start != -1:
obj_str = content[obj_start:i+1]
try:
obj = json.loads(obj_str)
objects.append(obj)
except json.JSONDecodeError as e:
print(f"JSON 解析错误:{e} 在 {obj_str}")
obj_start = -1
return objects
# 示例使用:
with open('result.json', 'r') as f:
content = f.read()
fixed_json = fix_json_by_char_analysis(content)
# 将修复后的 JSON 数据保存到新文件
with open('fixed_result.json', 'w') as f:
json.dump(fixed_json, f, indent=4)
print("修复后的JSON文件已保存")