使用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