方法一、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])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?