比较两个 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 对象数组,其中对象具有数组作为属性。我可以将数组元素映射到类的特定属性吗?

找出两个数组的相同元素,最优算法?

使用jackson从改造中反序列化json,其中相同的变量名可以代表两个不同的对象

比较 XACML 策略中的两个多元素属性

使用 Jackson 反序列化对象列表

Json to JObject转换的使用方法