Python查找JSON所有嵌套price键并关联对应name生成结果字典
跨任意嵌套层级提取「名称-价格」映射的实现方案
你之前写的递归逻辑出问题的核心原因,是把判断单元搞错了:之前的遍历逻辑是逐个匹配JSON里的键名,一旦定位到price键就直接返回对应值,完全没有回到price所在的完整字典节点上抓取同层级的name字段,自然没法组装成映射关系。
最优实现思路
整个逻辑不需要依赖JSONPath之类的第三方工具,纯原生递归就能做到最优O(n)时间复杂度(n为JSON结构的总节点数),核心调整点有三个:
- 把递归的判断单元从「单个键值对」换成「完整字典节点」
每遍历到一个字典结构,先检查当前字典里是否存在price键,只要命中就直接在当前节点内读取对应的name值写入结果,不需要等遍历到name键的时候再回头找price - 递归覆盖所有可能的嵌套结构
不管当前字典节点是不是命中了price的判断,都要继续向下遍历所有子值——包括字典类型的嵌套结构、数组列表里的所有元素,不能因为当前节点命中就跳过深层遍历,避免漏抓嵌套在更内层的其他price节点 - 做好字段容错和结构防覆盖
取name值的时候用get方法设置默认值,避免出现「节点只有price没有name」的场景直接抛KeyError中断流程;如果JSON里存在重名的商品节点,不要直接用字典存映射(会出现后值覆盖前值的问题),可以换成列表存储每一组提取到的name-price对
可直接运行的参考代码
def extract_name_price(json_node, result=None): # 初始化结果集,规避可变默认参数的经典Python坑 if result is None: result = [] # 处理字典类型节点 if isinstance(json_node, dict): # 当前节点包含price时,提取同层级的name和price if "price" in json_node: extracted_item = { "name": json_node.get("name", "未命名商品"), "price": json_node["price"] } result.append(extracted_item) # 递归遍历所有字典值,不遗漏深层嵌套 for sub_val in json_node.values(): extract_name_price(sub_val, result) # 处理数组/列表类型节点 elif isinstance(json_node, list): for sub_item in json_node: extract_name_price(sub_item, result) return result
代码默认用列表存储结果,避免重名节点的price被意外覆盖。如果确认JSON结构中不存在重名的节点,只需要把结果集初始化时换成空字典,将append逻辑替换为
result[extracted_item["name"]] = extracted_item["price"],就能直接输出纯「名称-价格」映射字典。
常见踩坑提醒
- 不要把判断逻辑写在键名遍历环节:很多人之前的写法是
for key, val in node.items(): if key == "price": 记录price值,这种写法天然割裂了同节点下不同键的关联,根本拿不到同节点的name - 不要在命中price后提前终止递归:比如出现「外层分类带总price,内层分类带子商品price」的结构,提前终止会直接漏掉深层的子项数据
- 不要硬取字段值:直接写
node["name"]会遇到节点缺字段时的崩溃问题,统一用get方法设置兜底值能大幅提升脚本鲁棒性
内容的提问来源于stack exchange,提问作者robs
相关产品推荐
相关产品推荐

