
本文介绍一种通用、健壮的方法,通过递归遍历任意深度的嵌套 json(字典/列表结构),精准提取所有匹配键(如 `"aaaa"` 或 `"bbbb"`)对应的值,并组装为 python 列表。适用于结构不固定、层级复杂的真实业务数据。
在处理真实 API 返回或配置文件中的嵌套 JSON 时,我们常遇到键名相同但嵌套层级多变的情况(如示例中 "AAAA" 和 "BBBB" 分散在多个 values 数组内的深层对象中)。此时,硬编码路径(如 data['customFields'][2]['values'][0][0]['values'][0]['AAAA'])极易出错且不可维护。
推荐采用递归深度优先搜索(DFS)策略:统一将 JSON 视为树形结构,对每个节点判断其类型(字典 or 列表),并递归访问其子元素,一旦发现目标键即收集值。
以下是一个简洁、可复用的工具函数:
import json
def extract_values(data, key):
"""
递归提取 JSON 数据中所有指定 key 对应的值(支持任意嵌套层级)
Args:
data: dict 或 list 类型的 JSON 解析后对象
key: 要查找的字符串键名
Yields:
所有匹配 key 的值(按 DFS 遍历顺序)
"""
if isinstance(data, dict):
# 若当前是字典,检查是否直接包含目标 key
if key in data:
yield data[key]
# 递归遍历所有 value(可能为 dict/list/基本类型)
for value in data.values():
yield from extract_values(value, key)
elif isinstance(data, list):
# 若当前是列表,递归遍历每个元素
for item in data:
yield from extract_values(item, key)
# 基本类型(str/int/bool/None)不作处理,自动跳过使用该函数即可轻松获取所需结果:
# 假设 raw_json 是你提供的原始字符串(注意:示例 JSON 缺少结尾大括号,实际使用前需补全)
# data = json.loads(raw_json)
# 提取所有 "AAAA" 和 "BBBB" 的值
List_AAAA = list(extract_values(data, "AAAA")) # → [9090, 9091]
List_BBBB = list(extract_values(data, "BBBB")) # → ["MONACO", "NICE"]
print("List_AAAA:", List_AAAA) # [9090, 9091]
print("List_BBBB:", List_BBBB) # ['MONACO', 'NICE']✅ 关键原理说明:
- yield from 实现了生成器委托,使递归调用能无缝“透传”底层 yield 的值;
- 函数不依赖任何预设路径,仅关注“键存在性”,因此天然适配动态结构(如 values 可能是 [...] 或 [[...]] 多层嵌套);
- 自动跳过非容器类型(如字符串、数字),避免 TypeError;
- 时间复杂度为 O(N),N 为 JSON 中所有节点总数,是最优遍历方案。
⚠️ 注意事项:
- 确保输入 data 已通过 json.loads() 正确解析为 Python 对象(而非原始字符串);
- 若 JSON 中存在同名键但语义不同,该方法会一并提取——如需精确控制,可扩展为带路径过滤或类型校验的版本;
- 生产环境建议增加异常处理(如 try/except json.JSONDecodeError)和日志。
此方法不仅解决当前问题,更可作为通用 JSON 提取工具集成至项目 utils 模块,大幅提升处理不规则数据的开发效率。










