通过递归函数遍历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则继续走递归。