与python中另一个json的json递归比较

2024-06-16 15:00:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在比较一个json对象的所有元素是否都在另一个json中。 为此,我把所有的键都放在一个小图层上,然后检查它们是否在大图层中,以及它们是否相同。为了深入到更深层,我调用函数,给它一个包含更深层的元素。(在这个函数中,我现在用键“results”检测更深层的层,但我将来它将被更改为一个可变键。 我的问题是我不能调用递归函数。当试图调用函数中的函数时,它在脚本中说“字符串索引必须是整数,而不是unicode”。在

def compareJson(example_json_s, target_json_s): 
    #parsed_json
    example_json = example_json_s
    target_json = target_json_s
    p = 0
    keys = []
    for key in example_json.keys(): 
        keys.insert(p, key)
        p = p + 1

    passed = 0;
    for x in keys: 
        print "Keys"
        if x != "results": 
            if not x in target_json or x not in example_json.keys() and not example_json[x] == target_json[x]: 
                passed = 1
        else:
            print """###inhabits "results " going one layer deeper"""
        compareJson(example_json[key], target_json[key])
    return passed

以及一些json对象示例:

^{pr2}$

错误代码如下:

Traceback (most recent call last):
  File "/home/philip/Desktop/empfang_test.py", line 199, in <module>
    empfange() #Programm wartet in einer Endlosschleife auf eingehende Nachrichten.
  File "/home/philip/Desktop/empfang_test.py", line 193, in empfange
    checkvalue=compareJson(json.loads(config[1][1]),parsed_json_dummy)
  File "/home/philip/Desktop/empfang_test.py", line 183, in compareJson
    compareJson(example_json[key],target_json[key])   
TypeError: string indices must be integers, not str

Tags: keyinjsontargethomeexamplenotphilip
2条回答

这是我的解决方案

def contained(a, b):
    """ checks if dictionary a is fully contained in b """
    if not isinstance(a, dict):
        return a == b
    else:
        return all(contained(v, b.get(k)) for k, v in a.items())

print(contained(d1, d2))

对于您的输入给出False

^{pr2}$

给出True

为了

d1 = {
    "results": {
        "clock": True,
        "update": True,
        "autoreg": True,
        "qqq": True
    }
}

例如,目标中缺少一个键(例如qqq),它给出False

你当然可以用

contained(json.loads(example_json_s), json.loads(target_json_s))

从JSON字符串开始时

我认为应该使用以下代码:

def compareJson(example_json_s, target_json_s):
 example_json = json.loads(example_json_s)
 target_json = json.loads(target_json_s)
 return compareParsedJson(example_json, target_json)

def compareParsedJson(example_json, target_json):   
 for x in example_json:
   if type(example_json[x]) is not dict:
     if not x in target_json or not example_json[x] == target_json[x]:
       return False
   else:
     if x not in target_json or not compareParsedJson(example_json[x], target_json[x]):
      return False

 return True

在第一个函数中,我们解析完整的JSON对象(包括递归部分)。第二部分分析了它们。在

我对你的代码做了几处修改。在

  • 不需要先获取键的列表,您可以在example_json.keys()上迭代。另外,在您的示例中,我会将其替换为keys.append(key)。在
  • 该函数检查嵌套json对象的类型现在是否为dict(它已经被解析)。如果不是,那么它会比较它们,如果是,那么它就进入下一个。您可能需要为列表添加一个类似的子句。在
  • 当JSON的一部分不相同时,函数将立即返回False。在

编辑:对于您发布的错误代码,我认为您可能没有正确解析json。我认为您的注释#parsed_json是指您已经完成了,但是我认为您错过了上面代码示例中包含的json.loads方法调用。。?在

相关问题 更多 >