22

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

4

4 回答 4

18

您可以使用jsondiff

from jsondiff import diff
diff(json1, json2)

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

于 2016-09-23T14:27:27.307 回答
10

你可以使用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)
{}
于 2018-09-04T15:07:23.357 回答
7

从逻辑上讲,它们是相同的。

他们不是。JSON 数组中的顺序很重要。我不知道有什么工具会为您忽略订单。您可以尝试递归反序列化结构,将列表转换为某种多重集,将字典转换为某种可散列的冻结字典(因此您可以将它们放入多重集),然后在其上运行您自己的 diff 例程。

于 2013-07-12T05:34:45.697 回答
3

您可以尝试对 json.dumps(jobj, sort_keys=True) 的结果进行比较

于 2013-07-12T05:09:01.613 回答