You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:06:03