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
相关产品推荐
相关产品推荐

