[毕设记录]json格式问题解决

有时候保存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文件已保存")


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值