首页 > 解决方案 > 比较两个嵌套的 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)

此代码仅显示资源名称,我想显示标签也已更改、添加或删除。谁能指导我

标签: jsonpython-3.x

解决方案


如果你只是打印出“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'}}}

推荐阅读