赞
踩
json作为一种常用的数据交换格式,在日常coding中,出现的频率非常之高。
在测试的时候,可以方便的对json进行比较也是非常频繁的需求
一个简单版本的实现,这里用作记录
import json
def diff(a, b):
"""
:param a: dict
:param b: dict
:return: dict
"""
result = {}
# 遍历a,获取在b中不存在,或者是和b中的value不一致的对象
for key in a:
if key in b:
a_val = a[key]
b_val = b[key]
if a_val != b_val:
if (type(a_val) == dict) & (type(b_val) == dict):
inner_result = diff(a_val, b_val)
result[key] = inner_result
else:
result[key] = {'left': a_val, 'right': b_val}
else:
result[key] = {'left': a[key], 'right': '-'}
# 遍历b,获取在a中不存在
for key in b:
if key not in a:
result[key] = {'left': b[key], 'right': '-'}
return result
if __name__ == '__main__':
s = """
{
"r":{
"sd":23,
"d":33
},
"a":12,
"i":98
}
"""
s2 = """
{
"r":{
"sd":23,
"d":35
},
"a":14,
"b":78,
"i":98
}
"""
result = diff(json.loads(s), json.loads(s2))
print(json.dumps(result, indent=2))
结果解释:
在整个结果dict 中,key分为三种情况:
1)left:value对应在diff方法中传入的第一个参数的value
2)right:value对应在diff方法中传入的第二个参数的value
3)如果是非1和2两种情况,那么就说明该key是diff方法中传入的两个dict参数中value不同的key。
如上面的结果中:
先实现python版本的,是因为在json.loads方法中,如果子层结果为dict,那么可以自动识别到,所有上面直接判断了是否为dict类型
todo:可视化,其他语言版本
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。