比较两个 JSON 对象,而不考虑其中的元素序列
Posted
技术标签:
【中文标题】比较两个 JSON 对象,而不考虑其中的元素序列【英文标题】:Comparing two JSON objects irrespective of the sequence of elements in them 【发布时间】:2013-07-10 13:36:12 【问题描述】:python中是否有任何方法/类/模块来比较两个json对象并打印更改/差异?
我尝试过使用“json_tools”,它给出了相当好的结果,但是如果两个 json 对象中存在具有不同顺序元素的 python 列表,则 diff 失败。
例如
JSON 1:
'Person' :
'FName' : 'John',
'LName' : 'Rambo',
'Sex' : 'Male'
'Height' : '6 ft',
'Weight' : '90 KG',
'Children' :
[
'FName' : 'Anna',
'LName' : 'Rambo',
'Sex' : 'Female',
'Height' : '5 ft',
'Weight' : '55 KG',
,
'FName' : 'Jemmy',
'LName' : 'Rambo',
'Sex' : 'Male',
'Height' : '5 ft',
'Weight' : '60 KG',
]
JSON 2:
'Person' :
'FName' : 'John',
'LName' : 'Rambo',
'Sex' : 'Male'
'Height' : '6 ft',
'Weight' : '90 KG',
'Children' :
[
'FName' : 'Jemmy',
'LName' : 'Rambo',
'Sex' : 'Male',
'Height' : '5 ft',
'Weight' : '60 KG',
,
'FName' : 'Anna',
'LName' : 'Rambo',
'Sex' : 'Female',
'Height' : '5 ft',
'Weight' : '55 KG',
]
json diff 显示两个 json 不匹配。逻辑上它们是相同的。
在python中有没有好的json匹配和比较方法?
【问题讨论】:
【参考方案1】:您可以将deepdiff 与ignore_order=True
一起使用
from deepdiff import DeepDiff
t1 = 1:1, 2:2, 3:3, 4:"a":"hello", "b":[1, 2, 3]
t2 = 1:1, 2:2, 3:3, 4:"a":"hello", "b":[1, 3, 2, 3]
ddiff = DeepDiff(t1, t2, ignore_order=True)
print (ddiff)
【讨论】:
t1中的[1, 2, 3]和[1, 3, 2, 3]之间有区别 来自 t2。怎么输出是空的?? @AfsanAbdulaliGujarati 如果您想收到重复提醒,可以添加report_repetition=True
。查看他们的文档【参考方案2】:
您可以使用jsondiff
from jsondiff import diff
diff(json1, json2)
...假设您的 json1 和 json2 加载了示例中的 json 条目(顺便说一下,在“sex”条目之后缺少逗号)。
【讨论】:
很好的答案!帮助我比较了两个自动生成的 json 文件并处理差异,直到diff
输出为空,就像我想要的那样。
我发现***.com/questions/25851183/…这个链接更有帮助
这是否也适用于嵌套的 json 对象数组?【参考方案3】:
逻辑上它们是相同的。
他们不是。 JSON 数组中的顺序很重要。我不知道有什么工具会为您忽略订单。您可以尝试对反序列化结构进行递归,将列表转换为某种多重集,将字典转换为某种可散列、冻结的字典(这样您就可以将它们放入多重集),然后在其上运行您自己的 diff 例程。
【讨论】:
我们如何通过忽略一些键来使用它?【参考方案4】:您可以尝试对 json.dumps(jobj, sort_keys=True) 的结果进行比较
【讨论】:
sort_keys
不会重新排序 JSON 数组;它只影响 JSON 对象键值对的序列化顺序。以上是关于比较两个 JSON 对象,而不考虑其中的元素序列的主要内容,如果未能解决你的问题,请参考以下文章
尝试反序列化 JSON 对象数组,其中对象具有数组作为属性。我可以将数组元素映射到类的特定属性吗?