我正在尝试递归/灵活地解析任何有效的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
键。也许可以共享调用此方法的初始数据?另外,预期输出是多少?很难说出您要达到的目标,但尝试以下操作可能会有所帮助。