json - 比较两个嵌套的 json 文件并向用户显示更改的确切位置以及使用 Python 的 json 文件?
问题描述
我有两个 json 文件。我正在验证响应是否相同或不同。我需要向用户展示哪里有确切的变化。在此文件中添加或删除或更改了一些类似于特定键的内容。
文件1.json
[
{
"Name": "Jack",
"region": "USA",
"tags": [
{
"name": "Name",
"value": "Assistant"
}
]
},
{
"Name": "MATHEW",
"region": "USA",
"tags": [
{
"name": "Name",
"value": "Worker"
}
]
}
]
文件2.json
[
{
"Name": "Jack",
"region": "USA",
"tags": [
{
"name": "Name",
"value": "Manager"
}
]
},
{
"Name": "MATHEW",
"region": "US",
"tags": [
{
"name": "Name",
"value": "Assistant"
}
]
}
]
如果您看到两个 JSON,您可以发现差异,因为 file2.json 中的一个区域已更改为 US 并且值已从经理更改为助理和工人。现在我想向用户展示 file2.json 有一些更改,例如 region :US 和 Manager 更改为 Assistant。
我使用 deepdiff 进行验证。
from deepdiff import DeepDiff
def difference(oldurl_resp,newurl_resp,file1):
ddiff = DeepDiff(oldurl_resp, newurl_resp,ignore_order=True)
if(ddiff == {}):
print("BOTH JSON FILES MATCH !!!")
return True
else:
print("FAILURE")
output = ddiff
if(output.keys().__contains__('iterable_item_added')):
test = output.get('iterable_item_added')
print('The Resource name are->')
i=[]
for k in test:
print("Name: ",test[k]['Name'])
print("Region: ",test[k]['region'])
msg= (" Name ->"+ test[k]['Name'] +" Region:"+test[k]['region'] +". ")
i.append(msg)
raise JsonCompareError("The json file has KEYS changed!. Please validate for below" +str(i) +"in "+file1)
elif(output.keys().__contains__('iterable_item_removed')):
test2 = output.get('iterable_item_removed')
print('The name are->')
i=[]
for k in test2:
print(test2[k]['Name'])
print(test2[k]['region'])
msg= (" Resource Name ->"+ test2[k]['Name'] +" Region:"+test2[k]['region'] +". ")
i.append(msg)
raise JsonCompareError("The json file has Keys Removed!!. Please validate for below" +str(i)+"in "+file1)
此代码仅显示资源名称,我想显示标签也已更改、添加或删除。谁能指导我
解决方案
如果你只是打印出“test”变量的值,你会发现“tag”变量的变化在里面,这个例子中test的test值是:
test = {'root[0]': {'region': 'USA', 'Name': 'Jack', 'tags': [{'name': 'Name', 'value': 'Manager'}]}, 'root[1]': {'region': 'US', 'Name': 'MATHEW', 'tags': [{'name': 'Name', 'value': 'Assistant'}]}}
你可以打印test[k]['tags']
或添加你的“msg”变量。
建议:
此外,如果您的数据有一些主键(例如,它们有“id”,或者它们的顺序始终是固定的),您可以逐个比较它们的数据(而不是比较整个列表),并且可以进行更好的比较。例如,如果您将“Jack”的数据一起比较,您将有以下比较:
{'iterable_item_removed': {"root['tags'][0]": {'name': 'Name', 'value': 'Assistant'}}, 'iterable_item_added': {"root['tags'][0]": {'name': 'Name', 'value': 'Manager'}}}
推荐阅读
- php - MYSQL 8.0 与 PHP 5.6 的连接
- javascript - 如何将输入中的单词添加到另一个输入表单
- python - Python中的马尔可夫转移概率矩阵实现
- c# - 尽管在一定数量的消息后数据可用,但读取流“冻结”
- c# - 作为样式的设置器值绑定到边距
- javascript - 如何使用sails v.1向postgresql数据库添加新记录?
- reactjs - 创建一个像 slack 一样的子域,例如:https://someteam.slack.com/ in REACT JS
- python - 如何在熊猫取消堆叠之前动态重命名列?
- python - f(a, *b) 的 Python 参数匹配
- python - Flask-SQLAlchemy:sqlite3 IntegrityError