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

p1iqtdky  于 2023-01-10  发布在  其他
关注(0)|答案(4)|浏览(253)

python中有没有什么方法/ class / module可以比较两个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匹配和比较的好方法?

0mkxixxg

0mkxixxg1#

您可以使用jsondiff

from jsondiff import diff
diff(json1, json2)

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

oaxa6hgo

oaxa6hgo2#

你可以使用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)
{}
y53ybaqx

y53ybaqx3#

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

92vpleto

92vpleto4#

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

相关问题