Python比较两个Json对象,而不考虑其中元素的顺序

2024-05-12 20:06:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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匹配和比较方法?


Tags: 对象方法json格式difffnamemaleheight
3条回答

你可以使用jsondiff

from jsondiff import diff
diff(json1, json2)

。。。假设json1和json2加载了示例中的json条目(顺便说一下,“sex”条目后面缺少逗号)。

Logically those are identical.

他们不是。顺序在JSON数组中很重要。我不知道有什么工具会无视你的订单。您可以尝试在反序列化的结构上递归,将列表转换成某种多集,将dict转换成某种散列的、冻结的dict(这样您就可以将它们转换成多集),然后在上面运行自己的diff例程。

可以将deepdiffignore_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)
{}

相关问题 更多 >