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