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

