Python通过键路径字符串获取JSON嵌套结构值的实现及第三方包查询
可用第三方包
- jmespath:专门为JSON路径查询设计的第三方库,原生支持
foo2[0].bar2格式的路径语法。
安装命令:pip install jmespath
使用示例:import jmespath result = jmespath.search("foo2[0].bar2", data_dict) # 返回结果为 "koko" - pydash:Python版的Lodash工具库,内置的
get方法直接支持目标路径格式。
安装命令:pip install pydash
使用示例:import pydash result = pydash.get(data_dict, "foo2[0].bar2") # 返回结果为 "koko" - glom:主打嵌套数据处理的工具库,支持简化的路径写法,把索引改成点加数字即可使用。
安装命令:pip install glom
使用示例:import glom result = glom.glom(data_dict, "foo2.0.bar2") # 返回结果为 "koko"
手动实现方案
如果不想引入第三方依赖,可以用下面的轻量实现,兼容目标路径格式、支持任意嵌套层级、异常场景返回自定义默认值:
import re from typing import Any, Optional def get_nested_value(data: dict | list, path: str, default: Optional[Any] = None) -> Any: # 将[索引]格式替换为.索引,统一按点分割路径 processed_path = re.sub(r'\[(\d+)\]', r'.\1', path) keys = [k for k in processed_path.split('.') if k] current = data for key in keys: try: # 数字自动转int适配列表索引 if key.isdigit(): key = int(key) current = current[key] except (KeyError, IndexError, TypeError): return default return current
使用测试
data_dict = { "foo1": "bar1", "foo2": [{"bar2": "koko"}, {"bar3": "koko2"}], "foo3": { "foo4": "bar4", "foo5": { "foo6": "bar6", "foo7": "bar7", }, } } print(get_nested_value(data_dict, "foo2[0].bar2")) # 输出:koko print(get_nested_value(data_dict, "foo3.foo5.foo7")) # 输出:bar7 print(get_nested_value(data_dict, "foo2[2].xxx", default="不存在的路径")) # 输出:不存在的路径
内容的提问来源于stack exchange,提问作者Adi Epshtain
相关产品推荐
相关产品推荐

