Python比较dict和json相等的问题

使用Python经常会遇到对比dict和json相等问题。
1 比较两个json相等或包含:
先将json转换dict。然后进行比较。
转换的的方法:http://blog.csdn.net/qq_37023538/article/details/53693222

2、 python递归对比两个dict的代码:

def cmp_dict(src_data,dst_data):     
    assert type(src_data) == type(dst_data),"type: '{}' != '{}'".format(type(src_data), type(dst_data))  
    if isinstance(src_data,dict):  
        assert len(src_data) == len(dst_data),"dict len: '{}' != '{}'".format(len(src_data), len(dst_data))  
        for key in src_data:                  
            assert dst_data.has_key(key)      
            cmp_dict(src_data[key],dst_data[key])      
    elif isinstance(src_data,list):                    
        assert len(src_data) == len(dst_data),"list len: '{}' != '{}'".format(len(src_data), len(dst_data))      
        for src_list, dst_list in zip(sorted(src_data), sorted(dst_data)):  
            cmp_dict(src_list, dst_list)  
    else:  
        assert src_data == dst_data,"value '{}' != '{}'".format(src_data, dst_data)  

if __name__ == "__main__":  
    xx = {"111":None,"23456":{"22222":9999,"33333":"0000","list":["3333","4444","111"]}}  
    yy = {"111":None,"23456":{"22222":9999,"33333":"0000","list":["111","3333","4444"]}}  
    cmp_dict(xx,yy)  

由于json,dict中可能包含list结果,所以要处理list。

3、 dst_data包含src_data:
上面的代码去掉数据元素个数相等比较就可以了。

def cmp_dict(src_data,dst_data):     
    assert type(src_data) == type(dst_data),"type: '{}' != '{}'".format(type(src_data), type(dst_data))  
    if isinstance(src_data,dict):  
        for key in src_data:                  
            assert dst_data.has_key(key)      
            cmp_dict(src_data[key],dst_data[key])      
    elif isinstance(src_data,list):                        
        for src_list, dst_list in zip(sorted(src_data), sorted(dst_data)):  
            cmp_dict(src_list, dst_list)  
    else:  
        assert src_data == dst_data,"value '{}' != '{}'".format(src_data, dst_data)  

if __name__ == "__main__":  
    xx = {"111":None,"23456":{"22222":9999,"33333":"0000","list":["3333","4444","111"]}}  
    yy = {"111":None,"23456":{"22222":9999,"33333":"0000","list":["111","3333","4444"]}}  
    cmp_dict(xx,yy)  

python比较两个json文件
方法二

def diff_dict(expect,actual):
        for k,v in expect.items():
            if k not in actual.keys():
                return False
            v1 =actual[k]

        if type(v) != type(v1):
            return False

        elif type(v) == dict:    
            if not diff_dict(v,v1):
                return False

        elif type(v) == list:
            if not diff_list(v,v1):
                return False
        else:
            pass

    return True


def diff_list(expect,actual):
    if len(expect) == 0:
        return True

    v=expect[0]
    for v1 in actual:
        if type(v) != type(v1):
            return False

        if type(v) == list:
            if not diff_list(v,v1):
                return False

        if type(v) == dict:
            if not diff_dict(v,v1):
                return False

    return True


if __name__ == "__main__":
    get={"aa":"a","qq":[{"pp":"par","aaa":"aa","e":[{"a":"aaa"}]}]}
    text={"qq":[{"aaa":"par"}]}
    print diff_dict(text,get)

转载:http://blog.csdn.net/qq_37023538/article/details/54379591

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值