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

嵌套Python JSON中查找指定键无输出的问题排查与解决

嵌套JSON提取指定键值对的解决方法

你用yield写的函数调用后没输出,核心原因是:yield创建的是生成器对象,它不会自动执行,必须通过迭代(比如for循环、转成列表)才能触发函数里的遍历逻辑,直接调用函数只会得到一个生成器对象,不会有任何输出。

下面给两种实用的解决思路:

思路1:改用列表收集结果(直接易懂)

把函数里的yield换成往列表里追加元素,最后返回整个列表,调用后直接就能拿到所有匹配的键值对,再转成字典即可。

示例代码:

def findkeys(data, target_key):
    result = []
    # 处理字典类型
    if isinstance(data, dict):
        for key, value in data.items():
            if key == target_key:
                # 找到目标键,存成(key, value)元组
                result.append((key, value))
            # 如果值是嵌套的字典或列表,递归遍历
            elif isinstance(value, (dict, list)):
                result.extend(findkeys(value, target_key))
    # 处理列表类型
    elif isinstance(data, list):
        for item in data:
            result.extend(findkeys(item, target_key))
    return result

# 调用示例
input_json = {"entry": [{"productOrService": "云服务", "id": "1001"}, {"details": {"productOrService": "意外险", "insurance": "平安财险"}}]}
# 提取指定键的所有键值对
target_pairs = findkeys(input_json, 'productOrService')
# 转成字典(注意:如果有重复键,后面的会覆盖前面的)
result_dict = dict(target_pairs)
print(result_dict)
# 输出: {'productOrService': '意外险'}

如果需要保留所有重复键的结果(比如同一个键出现多次),可以直接用返回的列表,不用转成字典。

思路2:保留生成器但正确调用

如果不想改yield的写法,那调用时必须迭代生成器才能拿到结果,比如用for循环遍历,或者转成列表:

def findkeys(data, target_key):
    if isinstance(data, dict):
        for key, value in data.items():
            if key == target_key:
                yield (key, value)
            elif isinstance(value, (dict, list)):
                # 用yield from简化递归生成器的返回
                yield from findkeys(value, target_key)
    elif isinstance(data, list):
        for item in data:
            yield from findkeys(item, target_key)

# 调用方式1:for循环遍历输出
for pair in findkeys(input_json, 'productOrService'):
    print(pair)
# 输出: ('productOrService', '云服务') 和 ('productOrService', '意外险')

# 调用方式2:转成列表后转字典
target_pairs = list(findkeys(input_json, 'productOrService'))
result_dict = dict(target_pairs)

这种生成器方案适合处理超大量数据(比如entry有上万个条目),因为它不会一次性把所有结果加载到内存里,内存占用更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:42:57