代码之家  ›  专栏  ›  技术社区  ›  Remotec

如何在Python中比较JSON对象,其中每个对象可以具有不同的属性

  •  0
  • Remotec  · 技术社区  · 6 年前

    注:修改了原来的问题,以证明我正试图做什么

    我有两个json对象列表,需要检查它们是否“相同”,例如。

    x = [
      {
        "Id": "A",
        "Type": "A",
        "Component": "A",
        "Level": "A",
        "Debug": "A",
        "Space": 1
      },
      {
        "Id": "B",
        "Type": "B",
        "Component": "B",
        "Level": "B",
        "Debug": "B",
      }
    ]
    
    y = [
      {
        "Id": "B",
        "Type": "B",
        "Component": "B",
        "Level": "B",
        "Debug": "B",    
      },
      {
        "Id": "A",
        "Type": "A",
        "Component": "A",
        "Level": "A",
        "Debug": "A",
        "Space": 1
      }
    ]
    

    为了达到我所做的目的,这些物体将被归类为相同的。

    背景:我有一个api返回的数据,我无法控制。我需要检查返回的数据是否与我拥有的预存储定义相同。如果它是相同的,即两个列表包含相同数量的对象和包含相同键的对象,那么我需要返回 True . 否则 False . 注意字典中的键可以按不同的顺序排列。

    到目前为止我所做的:

    • 表演一个 json.dumps() 具有 sort_keys 集合。这似乎只是对顶级对象进行排序,而不是深入到子对象。

    • 我也试过反对 y 将对象A移到对象B上方。然后执行 x == y 比较确实会回来 .

    基于上述情况,看起来内置的相等运算符希望对象按相同的顺序排序。因此,我认为可以根据 Type 然后 Id 可能是前进的方向。这个 类型 字段确定对象是否包含 Space 属性,在某些对象中添加属性似乎表明排序很重要。

    注1:性能并不重要。 注2:我不熟悉python,所以不确定从工具箱中使用哪个工具,或者是否有内置的工具。

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   BlueSheepToken    6 年前

    JSON只是序列化的对象,可以将其加载到Python DISTS中 json 模块和 loads load 方法(取决于您的输入),然后使用 == 操作人员

    import json
    d1 = json.loads("""[{
        "a": 1,
        "b": 2,
        "c": {
            "x": 9,
            "y": 10
        }
    },
    {
        "a": 10,
        "b": 20,
        "c": {
            "x": 90,
            "y": 100
        }
    }]""")
    
    d2 = json.loads("""[{
        "b": 2,
        "a": 1,
        "c": {
            "x": 9,
            "y": 10
        }
    },
    {
        "a": 10,
        "b": 20,
        "c": {
            "y": 100,
            "x": 90
        }
    }]""")
    print(d1 == d2) # True
    

    顺便说一下,您的json不是有效的,我必须添加一些逗号