【问题标题】:Comparing two JSON objects irrespective of the sequence of elements in them比较两个 JSON 对象,而不考虑其中的元素序列
【发布时间】: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匹配和比较方法?

【问题讨论】:

    标签: python json


    【解决方案1】:

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

    【讨论】:

    • 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 输出为空,就像我想要的那样。
    • 我发现stackoverflow.com/questions/25851183/…这个链接更有帮助
    • 这是否也适用于嵌套的 json 对象数组?
    【解决方案3】:

    逻辑上它们是相同的。

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

    【讨论】:

    • 我们如何通过忽略一些键来使用它?
    【解决方案4】:

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

    【讨论】:

    • sort_keys 不会重新排序 JSON 数组;它只影响 JSON 对象键值对的序列化顺序。
    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多