Python比较两个Json对象,不管它们中的元素序列如何

时间:2013-07-12 04:52:19

标签: python json

python中是否有任何方法/类/模块来比较两个json对象并打印更改/差异?

我尝试过使用“json_tools”,这会产生相当不错的结果,但是如果有两个json对象中有不同顺序元素的python列表,则diff会失败。

e.g。

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显示两个jsons不匹配..逻辑上它们是相同的..

在python中有没有一种好的json匹配和比较方法?

4 个答案:

答案 0 :(得分:4)

  

逻辑上那些是相同的。

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

答案 1 :(得分:4)

您可以使用jsondiff

{{1}}

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

您可以将deepdiff ProcessStartInfo info = new ProcessStartInfo("C:\\PsTools"); info.FileName = @"C:\PsTools\psexec.exe"; info.Arguments = @"\\" + "MyComputerName" + @" -h D:\Idealake\Schedulers\SBIHangFireConsole\bin\Debug\SBIHangFireConsole.exe"; info.RedirectStandardOutput = true; info.UseShellExecute = false; Process p = Process.Start(info); 一起使用

ignore_order=True