Python使用JSON Diff比较多级JSON对象

本文旨在演示我们如何比较两个多级JSON对象并确定它们是否相同。

在Python中比较多级JSON对象

JSON对象是JavaScript Object Notation的缩写,主要用于交换数据,通常被认为是非常轻巧的。它的主要优点之一是可以被人类和机器轻松理解–如容易解析,允许设备提取有价值的信息。

由于它的频繁使用,我们可能需要对两个对象进行比较,无论什么原因。它可以是检查它们的内容是否相同,也可以是出于其他目的。

考虑一下下面的代码:

obj1 = {"countries":[
    {
        "name":"Great Britian",
        "cities":[
            {"name":"Manchester"},
            {"name":"London"}
        ]
    }
]}
obj2 = {"countries":[
    {
        "name":"Great Britian",
        "cities":[
            {"name":"London"}
        ]
    }
]}

该代码片段显示,我们有两个JSON对象存储了关于国家和城市的信息。这里要注意的一个有趣的事情是,它们是多层次的,这意味着这些对象包含更多的JSON对象,这些对象被嵌套在里面。

在Python中使用等价操作符来比较多级JSON对象

在深入研究任何第三方库之前,最好检查一下我们的任务是否可以通过标准的Python函数完成。幸运的是,对于我们的用例来说,等价操作同样适用。

不过,如果你需要对变量进行更多的控制,比如过滤数据或寻找特定的变化,你可能需要使用第三方库,因为平等运算符没有提供人们可能需要的那么多灵活性。对于更直接的情况,使用平等运算符是绰绰有余的。

考虑一下下面的代码:

obj1 = {
    "errors": [
        {"error": "err1", "fld": "mail"},
        {"error": "err2", "fld": "name"}
    ],
    "success": "false"
}
obj2 = {
    "errors": [
        {"error": "err1", "fld": "mail"},
        {"error": "err2", "fld": "name"}
    ],
    "success": "false"
}
obj3 = {
    "errors": [
        {"error": "err1", "fld": "mail"},
        {"error": "err2", "fld": "name"},
        {"error": "err3", "fld": "time"}
    ],
    "success": "false"
}
print(obj1 == obj2)
print(obj2 == obj3)

输出:

True
False

在下面,我们可以看到有三个JSON对象被声明,其中两个是相同的,一个是不同的。使用平等运算符,我们可以确定它们是否相同。

这种方法比任何第三方库更容易实现,也省去了查阅库的文档的麻烦。另一方面,它没有提供很多功能,如果需要,可以使用第三方模块/库来实现。

使用jsondiff 来比较Python中的多级JSON对象

jsondiff 是一个第三方的开源模块,可以用来区分JSON和类JSON结构。使用这个库,可以很容易地找到JSON对象之间的差异,无论是多级的还是无序的。

在跳转到看我们如何做到这一点之前,让我们先安装jsondiff ,因为它是一个第三方模块,并没有内置在任何标准的Python安装中。

安装指南jsondiff

打开命令提示符,执行下面的命令,开始安装jsondiff

pip install jsondiff

输出:

Collecting jsondiff
Downloading jsondiff-2.0.0-py3-none-any.whl (6.6 kB)
Installing collected packages: jsondiff
Successfully installed jsondiff-2.0.0

jsondiff 安装完毕后,我们可以开始使用它来完成我们的任务。

考虑一下下面的代码:

import jsondiff
obj1 = {"countries":[
    {
        "name":"Great Britian",
        "cities":[
            {"name":"Manchester"},
            {"name":"London"}
        ]
    }
]}
obj2 = {"countries":[
    {
        "name":"Great Britian",
        "cities":[
            {"name":"Manchester"},
            {"name":"London"}
        ]
    }
]}
res = jsondiff.diff(obj1, obj2)
if res:
    print("Diff found")
else:
    print("Same")

输出:

Same

在下面的代码中,我们使用了第三方库jsondiff 来查找两个对象是否相同。更具体地说,我们使用了函数jsondiff.diff() ,传递我们的JSON对象,命名为obj1obj2

jsondiff.diff 的工作方式是,如果它发现任何变化,它就会返回,我们将其保存在一个名为res 的变量中。是否有任何差异,我们可以快速确定被比较的对象是相同的还是不同的。