第一种方法:借助于Python包
安装json_tools包,示例代码:
import json_tools
def jsonDiff(a, b):
result = json_tools.diff(a, b)
print(result)
if __name__ == '__main__':
a = {
"id": 1,
"name": "aaaa",
"list": [1, 0, 2, 3],
"list_json:": [
{"id": 2,
"str": "aaaa2",
"list": [0, 1, 2, 3], },
{
"id": 1,
"str": "aaaa",
"list": [0, 1, 2],
}
],
"json": {
"aaa": 5
},
"str_json": "{\"aaa\":\"23\",\"int\":34}"}
b = {
"id": 1,
"name": "aaaa1",
"list": [0, 1, 2],
"list_json:": [
{
"id": 1,
"str": "aaaa",
"list": [0, 1, 2],
},
{"id": 2,
"str": "aaaa",
"list": [0, 1, 2, 3], }
],
"json": {
"aaa": 5
},
"str_json": "{\"aaa\":\"23\",\"int\":34}"}
jsonDiff(a, b)
输出结果:
[
{'replace': '/name', 'value': 'aaaa1', 'prev': 'aaaa'},
{'remove': '/list/3', 'prev': 3, 'details': 'array-item'},
{'replace': '/list/0', 'value': 0, 'prev': 1},
{'replace': '/list/1', 'value': 1, 'prev': 0},
{'replace': '/list_json:/0/id', 'value': 1, 'prev': 2},
{'replace': '/list_json:/0/str', 'value': 'aaaa', 'prev': 'aaaa2'},
{'remove': '/list_json:/0/list/3', 'prev': 3, 'details': 'array-item'},
{'replace': '/list_json:/1/id', 'value': 2, 'prev': 1},
{'add': '/list_json:/1/list/3', 'value': 3, 'details': 'array-item'}
]
第二种方法:自己写一个递归
该方法的优点是:可以自己定制化 比如:
- 针对list类型,可以排序后对比,如果list内是json的,可以根据某个字段排序后对比
- 还可以指定忽略字段,不进行对比
def cmp(src_data, dst_data):
for key in src_data:
if key not in dst_data.keys():
print("scr 不存在该key:", key)
if isinstance(src_data[key], dict):
thiskey = key
cmp(src_data[thiskey], dst_data[thiskey])
elif isinstance(src_data[key], list):
if (len(src_data[key]) != len(dst_data[key])):
print("长度不相等")
if isinstance(src_data[key][0], dict):
src_json_arr = src_data[key]
dst_json_arr = dst_data[key]
src_json_arr.sort(key=lambda x: x["id"])
dst_json_arr.sort(key=lambda x: x["id"])
for i in range(len(src_data[key])):
cmp(src_json_arr[i], dst_json_arr[i])
else:
if sorted(src_data[key]) != sorted(src_data[key]):
print("key:", key, src_data, dst_data)
else:
if src_data[key] != dst_data[key]:
print("key:", key, "src_value:", src_data[key], "dst_value:", dst_data[key])
if __name__ == '__main__':
a = {
"id": 1,
"name": "aaaa",
"list": [1, 0, 2, 3],
"list_json:": [
{"id": 2,
"str": "aaaa2",
"list": [0, 1, 2, 3], },
{
"id": 1,
"str": "aaaa",
"list": [0, 1, 2],
}
],
"json": {
"aaa": 5
},
"str_json": "{\"aaa\":\"23\",\"int\":34}"}
b = {
"id": 1,
"name": "aaaa1",
"list": [0, 1, 2],
"list_json:": [
{
"id": 1,
"str": "aaaa",
"list": [0, 1, 2],
},
{"id": 2,
"str": "aaaa",
"list": [0, 1, 2, 3], }
],
"json": {
"aaa": 5
},
"str_json": "{\"aaa\":\"23\",\"int\":34}"}
cmp(a, b)
|