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