首页 > 解决方案 > 比较 2 个 Json 文件并显示第二个文件的差异

问题描述

这是我有 JSON1.json 的两个 json 文件

{

  "name": "HOSTNAME1",

  "chef_environment": "non_prod",

  "run_list": [

    "role[MyOrg-non_prod]",

    "role[rhel7-latest]",

    "role[middleware-nonprod-all]",

    "role[MyApp-middleware_corebase_prod]",

    "role[MyApp_envs-test]",

    "role[MyApp_envs-dev]",

    "role[MyApp_nfs_mount]",

    "role[MyApp_access-dev]",

    "role[MyOrg-client-wrapper]"

  ]

}

JSON2.json

{

  "name": "HOSTNAME2",

  "chef_environment": "non_prod",

  "run_list": [

    "role[MyOrg-non_prod]",

    "role[rhel7-latest]",

    "role[MyApp_unix_app-dev]",

    "role[MyApp_middleware_corebase_prod]"

  ]

}

这些文件可能会或可能不会被排序。我需要获取 JSON1 中不可用的 JSON2 的唯一值

我最初尝试过使用类似的命令

findstr /vig:JSON1.json JSON2.json  | grep -v name| grep -e MyApp -e MyOrg | tr -d '\n'| sed -e 's:"::g' -e 's: *::g'  -e 's:,$::'

但是,这种方法有效,例如考虑在 JSON1 中我有一个条目“role [MyApp_middleware_corebase_prod]”,

并在 JSON2“角色 [MyApp_middleware_corebase_prod]”

请注意逗号的区别,虽然条目是相同的,因此不是唯一的,但是由于逗号的存在,这被认为是唯一的,并且给了我不想要的输出。

如果我比较 JSON1 与 JSON2 预期的输出是 角色 [MyApp_unix_app-dev] 因为这只是 JSON2 独有的

如果我比较 JSON2 和 JSON1

角色[MyApp_envs-test],角色[MyApp_envs-dev],角色[MyApp_nfs_mount],角色[MyApp_access-dev],角色[MyOrg-client-wrapper]

标签: pythonjson

解决方案


集减法(差异)是我认为你真正想要的:

import json


with open('json1.json', 'r') as f:
    json1 = json.load(f) 

with open('json2.json', 'r') as f:
    json2 = json.load(f) 

json2['run_list'] = list(set(json2['run_list']) - set(json1['run_list']))

print(json.dumps(json2, indent=2))

输出:

{
  "name": "HOSTNAME2",
  "chef_environment": "non_prod",
  "run_list": [
    "role[MyApp_unix_app-dev]"
  ]
}

推荐阅读