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

Python如何根据动态路径访问修改嵌套JSON(支持字典列表)

嵌套JSON动态路径更新实现方案

核心逻辑是将点分隔的路径字符串拆分为独立访问段,逐层遍历定位到目标节点的父级对象,最终完成赋值,原生兼容字典、列表混合的嵌套结构。

路径规则约定

  • 字典类型的键直接按点拆分即可,例如basket.cost对应逐层访问字典的basket键、cost键
  • 列表类型的索引直接以数字形式写入路径段,例如basket.items.0.color代表访问basket字典下items列表的第1个元素(索引从0开始)的color字段

实现代码

def set_nested_value(target: dict|list, path: str, value) -> None:
    """
    按点分隔路径给嵌套JSON结构赋值,兼容字典、列表混合结构
    :param target: 待修改的嵌套JSON对象
    :param path: 点分隔的访问路径,例如'basket.items.0.name'
    :param value: 要设置的目标值
    """
    path_segments = path.split('.')
    current_node = target
    # 遍历到倒数第二个路径段,定位到目标值的父节点
    for seg in path_segments[:-1]:
        if isinstance(current_node, list):
            current_node = current_node[int(seg)]
        else:
            current_node = current_node[seg]
    # 处理最后一个路径段,完成赋值
    last_seg = path_segments[-1]
    if isinstance(current_node, list):
        idx = int(last_seg)
        # 索引等于列表长度时自动追加元素,否则替换对应位置值
        if idx == len(current_node):
            current_node.append(value)
        else:
            current_node[idx] = value
    else:
        current_node[last_seg] = value


def get_nested_value(target: dict|list, path: str, default=None):
    """配套的按路径读值方法,方便校验更新结果"""
    path_segments = path.split('.')
    current_node = target
    try:
        for seg in path_segments:
            if isinstance(current_node, list):
                current_node = current_node[int(seg)]
            else:
                current_node = current_node[seg]
        return current_node
    except (KeyError, IndexError, ValueError):
        return default

使用示例

先构造一个同时包含字典、列表的测试结构:

shopping_data = {
    "name": "old shopping list",
    "basket": {
        "cost": 0,
        "items": [
            {"name": "apple", "color": "red"},
            {"name": "banana", "color": "yellow"}
        ]
    }
}

对应常见更新场景,调用方式如下:

  • 更新深层嵌套字典值:执行set_nested_value(shopping_data, 'basket.items.0.color', 'green'),等价于手动编写shopping_data['basket']['items'][0]['color'] = 'green',执行后苹果的颜色会被更新为green
  • 更新顶层键值:执行set_nested_value(shopping_data, 'name', 'my shopping'),直接修改顶层的name字段
  • 更新数值类字段:执行set_nested_value(shopping_data, 'basket.cost', 15.43),将购物篮总价修改为15.43
  • 给列表追加新元素:执行set_nested_value(shopping_data, 'basket.items.2', {"name": "orange", "color": "orange"}),会自动在商品列表末尾新增橙子条目

扩展说明

  • 如果需要支持路径不存在时自动创建中间节点,可以在遍历逻辑中增加判断:访问字典键不存在时自动创建空字典,访问列表索引超出长度时按需补空位
  • 路径中的列表段必须传入可转为整数的字符串,否则会抛出ValueError
  • 不要在路径首尾加多余的点,否则会拆分出空字符串段,触发键不存在的错误

内容的提问来源于stack exchange,提问作者SimonB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:09:33