【Python】对比嵌套JSON的不同

该篇文章详细描述了一个Python函数,用于对比两个JSON对象,检查其结构一致性,包括处理嵌套键值对和识别多余或缺失的字段。

前言

此对比默认json arry中的顺序相同,在Python中即list中出现的顺序相同。将结果保存在对应的xx_ret中。

import json
import os
import string

# 保存不同的字段
different_ret = []
# 保存缺失的字段
lack_ret = []
# 保存额外的字段
extra_ret = []

# 保存do_check对比时baseJson的前缀
base_json_pre_list = []

# 保存遍历多余字段的前缀
extra_pre_list = []

def do_check(jsonBase,json2):

    # 保证它们是同一种类型
    if isinstance(json2,dict):
        # 格式判断
        if not isinstance(jsonBase, dict):
            different_ret.append("格式错误")
            return

        for key_c,value_c in json2.items():

            if key_c == "conf" or key_c == "score":
                continue

            base_json_pre_list.append('['+"\""+key_c+"\""+']')
            # TODO: 更复杂的嵌套情况没有仔细想,但是应该不影响
            if key_c in jsonBase:

                tmp_aispeech_json = jsonBase[key_c]
                jsonBase["OC_" + key_c] = jsonBase.pop(key_c)

                # 判断value是否需要继续递归
                if isinstance(value_c, list) or isinstance(value_c, dict):

                    do_check(tmp_aispeech_json, value_c)
                    jsonBase["OC_" + key_c] = tmp_aispeech_json
                    continue

                # 无需继续递归,直接对比
                # 对比value
                if value_c != jsonBase["OC_" + key_c]:
                    # TODO: 收集不同的
                    different_ret.append(''.join(base_json_pre_list))

            else:
                # TODO: 收集缺少的
                lack_ret.append(''.join(base_json_pre_list))
                continue

            base_json_pre_list.pop()

    elif isinstance(json2,list):
        if not isinstance(jsonBase,list):
            different_ret.append("格式错误")
            return
        for item_c_i in range(len(json2)):
            if item_c_i >= len(jsonBase):
                lack_ret.append('['+str(item_c_i)+']')
                return
            base_json_pre_list.append('['+str(item_c_i)+']')
            do_check(jsonBase[item_c_i],json2[item_c_i])
            base_json_pre_list.pop()


# 检查额外的字段
def do_check_extra(json_object):
    if isinstance(json_object,dict):
        for key,value in json_object.items():
            extra_pre_list.append('['+"\""+key+"\""+']')
            if not isinstance(value,list) and not isinstance(value,dict): # v为string
                # 判断key是否被标记过,没有则保存
                if not "OC_" in key:
                    tmp_save_str = ''.join(extra_pre_list)
                    tmp_save_str = tmp_save_str.replace("OC_","")
                    extra_ret.append(tmp_save_str)
            else:
                do_check_extra(value)
            extra_pre_list.pop()

    elif isinstance(json_object,list):
        for item_i in range(len(json_object)):
            # 为了保存前缀,这里需要记录索引
            extra_pre_list.append('['+str(item_i)+']')
            do_check_extra(json_object[item_i])
            extra_pre_list.pop()
### 如何用 Python 解析处理嵌套 JSON 数据 在 Python 中,可以使用内置的 `json` 模块轻松解析 JSON 数据并将其转换为字典或列表结构。对于包含嵌套数组或多层嵌套的对象,其处理逻辑与简单 JSON 数据相同。 #### 使用 `json.loads()` 方法加载字符串形式的 JSON 数据 当 JSON 数据以字符串的形式存在时,可使用 `json.loads()` 将其解析为 Python 的字典或列表[^1]: ```python import json # 嵌套 JSON 示例数据 json_str = ''' { "name": "example", "data": { "newinfo": {"title": "Sample News", "date": "2023-09-01"}, "newstags": ["tag1", "tag2"], "nestedArray": [ {"id": 1, "value": "A"}, {"id": 2, "value": "B"} ] } } ''' # 转换为 Python 字典 parsed_data = json.loads(json_str) print(parsed_data["data"]["newinfo"]) # 输出基本信息部分 print(parsed_data["data"]["newstags"]) # 输出标签列表 ``` #### 访问嵌套字段 通过逐级访问键名的方式可以直接读取嵌套的数据项。例如,在上述例子中,要提取 `nestedArray` 下的第一个对象中的 `id` `value` 可按以下方式实现: ```python first_item = parsed_data["data"]["nestedArray"][0] print(first_item["id"], first_item["value"]) ``` #### 遍历嵌套数组 如果需要遍历整个嵌套数组,则可通过循环完成此操作: ```python for item in parsed_data["data"]["nestedArray"]: print(f"ID: {item['id']}, Value: {item['value']}") ``` #### 安装第三方工具包简化复杂场景下的数据获取 (如 csf_kit) 针对某些特定领域(比如新闻舆情分析),可能有专门设计好的库用于加速开发流程。例如提到过的 `csf_kit` 库可以帮助研究人员更快捷地取得所需信息[^2]。安装它只需执行简单的 pip 命令即可: ```bash pip install csf_kit ``` 随后按照官方文档指引调用相应接口函数来抓取消息源及其元属性等内容。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半生瓜のblog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值