【问题标题】:Compare 2 Json files and display the difference of second file [duplicate]比较2个Json文件并显示第二个文件的差异[重复]
【发布时间】:2019-06-27 13:25:49
【问题描述】:

这是我拥有的两个 json 文件 JSON1.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 我有一个条目 “角色[MyApp_middleware_corebase_prod]”,

在 JSON2 中 “角色[MyApp_middleware_corebase_prod]”

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

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

如果我比较 JSON2 和 JSON1

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

【问题讨论】:

标签: python json


【解决方案1】:

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

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]"
  ]
}

【讨论】:

  • 太好了,谢谢。但是我们可以只打印 run_list 的内容,即角色 [MyApp_unix_app-dev]
  • @baggi print(json.dumps(json2['run_list'], indent=2))
  • @baggi 你不需要使用json.dumps(...) 打印它,我这样做是因为缩进看起来更干净。
【解决方案2】:

你可以使用python设置交集

json1 = {

      "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={

          "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]"

          ]

        }
set1 = set(json1['run_list'])
set2 = set(json2['run_list'])
set3 = set1.intersection(set2)

【讨论】:

  • Intersection 只返回一个空集
猜你喜欢
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多