json下key和value无序对比

 通过递归函数遍历json,使用如‘if key in dst_data.keys()’  in方法判断key是否在json中,达到无序对比。同时通过list记录遍历的顺序,往下一步list.append(key);往上一步,list.pop()删除尾元素;如此,便可记录json结果不同时,报错的路径。

import json


def JsonToDict(file):
    with open(file, 'r') as f:
        str1 = f.read()
        r = json.loads(str1)
        return r


def cmp(src_data, dst_data, src_route, dst_route):
    if isinstance(src_data, dict):
        """若为dict格式"""
        for key in dst_data:
            if key not in src_data:
                dst_route.append(key)
                print("src不存在路径为如下的key:'%s' "%key,dst_route)
                dst_route.pop()
        for key in src_data.keys():
            if key in dst_data.keys():
                src_route.append(key)
                dst_route.append(key)
                # 递归
                cmp(src_data[key], dst_data[key], src_route, dst_route)
            else:
                src_route.append(key)
                print("dst不存在路径如下的key:'%s' "%key,src_route)
                src_route.pop()
    elif isinstance(src_data, list):
        """若为list格式"""
        if len(src_data) != len(dst_data):
            print("'{}'的 list len: '{}' != '{}'".format(src_route, len(src_data), len(dst_data)))
            src_route.pop()
            dst_route.pop()
        else:
            for src_list, dst_list in zip(src_data, dst_data):
                """递归"""
                src_route.append(src_list)
                dst_route.append(dst_list)
                cmp(src_list, dst_list, src_route, dst_route)
    else:
        if str(src_data) != str(dst_data):
            print("路径{}的值'{}'和'{}'不同".format(src_route, src_data,dst_data))
        src_route.pop()
        dst_route.pop()


dict1 = {"id": "100", "name": "苹果", "info": {"uid": "2020", "phoneName": ["一代", "苹果12"]}}
dict2 = {"id": "1000", "name": "华为", "info": {"uid": "2020", "phoneName": ["一代", "Mate40"]}}

src_route = ['src']
dst_route = ['dst']
# 把A,B替换成文件名,且AB要和这个py文件放在同一个目录
# dict1 = JsonToDict("A55allpower.json")
# dict2 = JsonToDict("AM8good.json")

cmp(dict1, dict2, src_route, dst_route)

注:list方法不通用,应该加入in判断。还需考虑多重结果,json嵌套list,list嵌套json,所以list下可以判断list的元素是str,则用in判断,为json则继续走递归。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值