
本文介绍如何使用 Python 从嵌套 JSON 列表中精准匹配 labels 字典内的多个键值对(如 __contacts__ 和 grafana_folder),并安全提取目标字段(如 alertname),兼顾健壮性与可读性。
本文介绍如何使用 python 从嵌套 json 列表中精准匹配 `labels` 字典内的多个键值对(如 `__contacts__` 和 `grafana_folder`),并安全提取目标字段(如 `alertname`),兼顾健壮性与可读性。
在处理 Grafana 告警导出的 JSON 数据时,常需根据 labels 中的元数据(如联系人标识、文件夹路径)快速定位特定告警,并提取其业务字段(如 alertname)。由于 JSON 结构深度嵌套且部分字段可能缺失,直接链式访问(如 entry["labels"]["__contacts__"])易触发 KeyError。因此,推荐采用 .get() 方法实现空安全(null-safe)查询。
以下是一个简洁、健壮的搜索函数:
def search_labels(data, contacts, grafana_folder):
"""
在 JSON 列表中查找 labels 匹配指定条件的 alertname
:param data: 解析后的 JSON 列表(list of dict)
:param contacts: 要匹配的 __contacts__ 值(字符串)
:param grafana_folder: 要匹配的 grafana_folder 值(字符串)
:return: 匹配项的 alertname 字符串,未找到则返回 None
"""
for entry in data:
# 安全获取 labels 字典,避免 KeyError
labels = entry.get("labels")
if not isinstance(labels, dict):
continue # 跳过 labels 缺失或非字典类型的条目
# 使用 get() 安全比对,支持 None 默认值
if (labels.get("__contacts__") == contacts
and labels.get("grafana_folder") == grafana_folder):
return labels.get("alertname")
return None # 未匹配到任何条目✅ 使用示例:
假设已通过 json.load() 将原始 JSON 加载为 alerts_data 变量:
import json
with open("alerts.json") as f:
alerts_data = json.load(f)
result = search_labels(alerts_data, '"Yours Truly_1"', "MyFolder")
print(result) # 输出: "XxX App memory alert "⚠️ 注意事项:
- __contacts__ 字段值在示例中包含英文双引号(如 "\"Yours Truly_1\""),实际匹配时需注意是否需去除外层引号(可用 strip('"') 预处理);
- 字符串比较区分大小写和空格(如 "Your Truly_1 Teams Alerts " 末尾空格会影响匹配),建议按需调用 .strip() 或使用正则模糊匹配;
- 若需返回全部匹配项(而非首个),可将 return 改为 yield 或收集至列表;
- 对于大规模数据,可考虑预构建索引(如 defaultdict(list) 按 grafana_folder 分组),提升重复查询性能。
该方案遵循 Python “显式优于隐式” 和 “简单优于复杂” 的哲学,无需第三方库,开箱即用,适用于自动化告警分析、CI/CD 状态校验等生产场景。

















