如何修改Python JSON遍历walk函数支持列表索引参数取值
问题原因
原来的walk函数仅适配了字典类(Mapping)结构的键遍历逻辑,未兼容列表(Sequence)的索引访问场景,所以传入整数索引访问列表元素时会被判定为路径非法。
修改后的walk函数
from collections import abc def walk(obj, *path): """ 按指定路径遍历JSON结构,找到目标值则返回,否则返回空字典并打印错误 """ for segment in path: # 处理字典类型的键访问 if isinstance(obj, abc.Mapping): if segment not in obj: print(f"Couldn't walk path; {path}") return {} obj = obj[segment] # 处理列表类型的索引访问,排除字符串(字符串属于Sequence但不需要按索引遍历单个字符) elif isinstance(obj, abc.Sequence) and not isinstance(obj, str): # 校验segment为合法整数索引 if not isinstance(segment, int) or segment < 0 or segment >= len(obj): print(f"Couldn't walk path; {path}") return {} obj = obj[segment] # 既不是字典也不是列表,无法继续遍历 else: print(f"Couldn't walk path; {path}") return {} return obj
逻辑说明
- 遍历每个路径段时优先判断当前对象类型
- 字典类对象沿用原逻辑校验键是否存在
- 列表类对象额外校验路径段是否为合法整数索引,且在列表长度范围内
- 排除字符串类型的Sequence判定,避免误将字符串按单个字符拆分访问
测试效果
调用 walk(json_value, "Information", 0) 会返回你期望的列表首元素字典;调用 walk(json_value, "Information", 1) 时会打印路径不存在的提示并返回空字典,符合需求。
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

