`KeyError:`递归解析JSON时-错误提供的信息很少

问题描述 投票:0回答:2

我正在尝试递归/灵活地解析任何有效的JSON对象。使用以下代码以及以下(进一步向下)的JSON示例遇到错误,这对我来说没有意义。下面的代码当前在下面输出输出,然后输出错误。错误的原因很难确定,因为可以预料到第一次通过的行为。第二次,不是那么多...而且错误至少可以说是神秘的。

def get_level_keys(obj, level_count=0, level_keys={}): 
    key_list = list(obj.keys()) 
    print(f"key_list {level_count}: {key_list}")  
    level_key = f"{level_count}_level" 
    rem_keys = [] 

    for key in key_list: 
        if type(obj[key]) in [int,bool,str,float]:  
            level_keys[level_key].append(key) 
        else: 
            rem_keys.append(key) 

        level_keys[level_key] = [] 
        for key in rem_keys:  
            if type(obj[key]) == dict: 
                level_count += 1 
                get_level_keys(obj[key], level_count, level_keys) 

    return(level_keys) 

当前输出为:

key_list 0: ['fields', 'name', 'tags', 'timestamp']
key_list 1: ['LogEndOffset', 'LogStartOffset', 'NumLogSegments', 'Size', 
'UnderReplicatedPartitions']

...然后出现以下错误:KeyError: '1_level'(第9行:level_keys[level_key].append(key))。

用于再现的Json:

{
    "fields": {
      "LogEndOffset": 0,
      "LogStartOffset": 0,
      "NumLogSegments": 1,
      "Size": 0,
      "UnderReplicatedPartitions": 0
    },
    "name": "partition",
    "tags": {
      "host": "CUD1-001560",
      "jolokia_agent_url": "http://localhost:7777/jolokia",
      "partition": "22",
      "topic": "qa-connect-offsets"
    },
    "timestamp": 1591124460
  }

有什么想法吗?预先感谢!

python json parsing recursion
2个回答
1
投票

对我来说,似乎level_keys[level_key]可能被初始化为[] 之后在行中被引用

level_keys[level_key].append(key)

此外,您可能会有多次添加密钥的风险,因此您应该为此添加检查。

尝试将代码重新排列为

def get_level_keys(obj, level_count=0, level_keys={}): 
    key_list = list(obj.keys()) 
    print(f"key_list {level_count}: {key_list}")  
    level_key = f"{level_count}_level" 
    rem_keys = [] 

    # CHANGE IS HERE
    if level_key not in level_keys:
        level_keys[level_key] = []

    for key in key_list:
        if type(obj[key]) in [int,bool,str,float]:  
            # CHANGE IS HERE
            if key not in level_keys[level_key]:
                level_keys[level_key].append(key) 
        else: 
            rem_keys.append(key) 

        for key in rem_keys:  
            if type(obj[key]) == dict: 
                level_count += 1 
                get_level_keys(obj[key], level_count, level_keys) 

    return(level_keys)

更新:

您还需要修正您的递归。除了执行level_count += 1,您应该使用[]

get_level_keys(obj[key], level_count + 1, level_keys)

您的代码当前为每个子键分配了一个新级别。


0
投票

您正在收到此错误,因为脚本无法在json对象中找到该键。您正在递归解析此json,但是它期望在某个地方找到失败的1_level键。也许可以共享调用此方法的初始数据?另外,预期输出是多少?很难说出您要达到的目标,但尝试以下操作可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.