【问题标题】:Python: Get the list of difference in object names and sub-objects between jsonsPython:获取json之间对象名称和子对象的差异列表
【发布时间】:2018-02-06 07:10:47
【问题描述】:

python新手:

json1.json

{
    "key1": {
        "s11": 1,
        "s12": 2,
        "s13": "abc"
    },

    "key2": {
        "s21": [1, 2, 3, 4],
        "s22": {
            "s221": {
                "s2211": "abc"
            }
        }
    },
    "key3": "name1"
}

json2.json

{
    "key1": {
        "p12": 2,
        "p13": "abc",
        "s11": 1
    },

    "key2": {
        "ps22": {
          "ps221": {
            "ps2211": "abc"
          }
        },
        "ps21": ["1", "2", "3", "4"],
        "ps23" : "abc",
        "ps24":1,
        "s21": [1,2,3,4]
    }
}

我正在尝试比较两个 json 对象名称; json1.json 和 json2.json 并想列出对象名称的区别
例如,列出以下差异
1. json1 中存在的 json2 中缺少 key3 --> 用下面的代码得到了这个
2.key2.s22改为key2.ps22,key1.s12改为key1.p12
3. 不会打扰key2.s22.s221.s2211 与key2.ps22.ps221.ps2211 不同,因为想要捕获初始层次差异

有人可以帮助我使用适当的方法或命令来捕捉这些差异吗?

我可以通过以下代码了解对象名称的差异。

d1=json.load(open("json1.json"))
d2=json.load(open("json2.json"))
s1=set(d1.keys()) - set(d2.keys())
print(s1)

o/p -> {'key3'}

但我的要求是在下一级层次结构中获得差异,即,
key2.s22 改为 key2.ps22
key2.s21 改为 key2.ps21

【问题讨论】:

  • Difference in a dict的可能重复
  • 没有内置或标准的方法来做到这一点。您必须实现(或研究是否已完成)一个递归函数才能做到这一点。
  • 同意,到目前为止,我能够通过递归检查来检查对象中的唯一键名,如下所示

标签: python json python-3.x


【解决方案1】:
import json

d1=json.load(open("1.json"))
d2=json.load(open("2.json"))

d11=list(d1.keys())
d22=list(d2.keys())

print(set(d1.keys())^set(d2.keys()))
chk_list = ["key2"]  # picking the keys to get the assymetry keynmaes within keynames

for i in chk_list:
    print(sorted(list(d1[i].keys())))
    print(sorted(list(d2[i].keys())))
    print(set(d1[i].keys()) ^ set(d2[i].keys()))

输出是

{'key3'}
['s21', 's22']
['ps21', 'ps22', 'ps23', 'ps24', 's21']
{'ps23', 's22', 'ps24', 'ps22', 'ps21'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2012-01-15
    • 2012-09-07
    相关资源
    最近更新 更多