• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

博客园    首页    新随笔    联系   管理    订阅  订阅
python json_tools对比两个json是否相等

方法一、jsonpatch

1.1安装  
  pip install jsonpatch

1.3使用

1 import jsonpatch
2 
3 src = {'numbers': [1, 3, 4, 8], 'foo': 'bar'}
4 dst = {'foo': 'bar4', 'numbers': [1, 3, 8,{'a':'5'}]}
5 patch = jsonpatch.JsonPatch.from_diff(src, dst)
6 
7 print(patch)
输出结果:
[{"op": "remove", "path": "/numbers/2"}, {"op": "add", "path": "/numbers/3", "value": {"a": "5"}}, {"op": "replace", "path": "/foo", "value": "bar4"}]

上面两个json对象,src要变成dst,需要移除numbers下索引是2的元素,numbers下索引为3的位置要添加{'a':'5'},foo的值要替换成'bar4'。

 

方法二、json_tools  

  json_tools是python的一个第三方模块,用于比对两个目标json是否相等,如果相等则返回True,否则返回包含不相等项的list。
但是如果两个目标json中都包含list,且两个list原本是相同的,只是list中元素位置不一样;而json_tools是默认用两个list中相同位置的元素进行比对,这样原本一样的list比对的结果是不相等的了。
如a=[a,b,c,d],b=[a,c,b,d],这两个list本是一样的,但是json_tools是用aa,bc,cb,dd进行对比,其结果自然是false。

2.1、安装  
  pip install json_tools

2.2、使用
2.2.1 单层比对

 1 import json_tools
 2 
 3 a = {'name':'yanan',"age":'20',"city":'beijing'}
 4 b = {'name':'Yanan',"age":'20',"town":'xicheng'}
 5 
 6 def json_fiff(json_1,json_2):
 7     result = json_tools.diff(json_1,json_2)
 8     return result
 9 
10 res = json_fiff(a,b)
11 print(res)
输出结果:
[{'replace': '/name', 'value': 'Yanan', 'prev': 'yanan'}, {'remove': '/city', 'prev': 'beijing'}, {'add': '/town', 'value': 'xicheng'}]

上面的输出结果显示的是b相对于a的变化(即由a变成b有哪些改变):
1)b和a都有键“name”,但b相对于a来说键“name”的值发生了变化,由原来的“yanan”变成了“Yanan”,所以比较结果的list里有{'replace': '/name', 'value': 'Yanan', 'prev': 'yanan'}
 其中replace标识发生变化的键,value标识变化后即当前a该键的值,prev标识该键此前的值
2)b相对于a没有键city键,所以结果的list里有{'remove': '/city', 'prev': 'beijing'}
3)b中的town相对于a是新增的键,所以结果list里有{'add': '/town', 'value': 'xicheng'}

2.2..2 多层嵌套的对比

 1 import json_tools
 2 
 3 a = {"name": "yanan", "pro": {"sh": "shandong", "city": ["zibo", "weifang"]}}
 4 b = {"name": "Yanan", "pro": {"sh": "shandong", "town": ["taian", "weifang"]}}
 5 
 6 def json_fiff(json_1,json_2):
 7     result = json_tools.diff(json_1,json_2)
 8     return result
 9 
10 res = json_fiff(a,b)
11 print(res)
输出结果:
[{'replace': '/name', 'value': 'Yanan', 'prev': 'yanan'}, {'remove': '/pro/city', 'prev': ['zibo', 'weifang']}, {'add': '/pro/town', 'value': ['taian', 'weifang']}]

 

方法三

  json数据转换成字典,再将两个字典按key排好序,然后使用zip()函数将两个字典对应的元素打包成元组。比较对应的元素的value是否相等。

1、json数据转换成字典
dict1 = json.load(load_f1)
dict2 = json.load(load_f2)

2、将两个字典按key排好序,然后使用zip()函数将两个字典对应的元素打包成元组。比较对应的元素的value是否相等。
for src_list, dst_list in zip(sorted(dict1), sorted(dict2)):
    if str(dict1[src_list]) != str(dict2[dst_list]):
        print(src_list,dict1[src_list],dst_list,dict2[dst_list])

 


 

posted on 2021-07-08 19:58  搁浅小夕  阅读(1719)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3