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



我正在尝试递归/灵活地解析任何有效的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
}

有什么想法吗? 提前感谢!

对我来说,似乎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)

代码当前为每个子项分配一个新级别。

您收到此错误是因为脚本无法在 json 对象中找到该键。您正在递归解析此 json,但它希望在某个地方找到失败的1_level键。您能否共享调用此方法的初始数据?还有预期的输出是多少?很难说你想实现什么,但试试下面,也许它可能会有所帮助。

def get_level_keys(obj, level_count=0, level_keys={}, empty_dict={}): 
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]:  
if level_keys.get(level_key, None):
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, empty_dict) 
empty_dict[level_key] = key_list
return empty_dict

相关内容

最新更新