You need to enable JavaScript to run this app. Python查找JSON所有嵌套price键并关联对应name生成结果字典
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 09:15:04