本文介绍如何正确访问 Python 响应中嵌套 JSON 的深层键(如 powerPlant.id),并提供健壮的取值方式,避免 KeyError,涵盖直接索引、异常捕获和安全的 .get() 链式调用三种实践方案。
本文介绍如何正确访问 python 响应中嵌套 json 的深层键(如 `powerplant.id`),并提供健壮的取值方式,避免 keyerror,涵盖直接索引、异常捕获和安全的 `.get()` 链式调用三种实践方案。
当你使用 requests 库发起 HTTP 请求后,常会收到类似如下结构的 JSON 响应(数组形式,首元素含嵌套对象):
[
{
"hpsId": 10032,
"powerPlant": {
"name": "Svartisen",
"id": 67302
}
}
]
此时,response.json()[0]["hpsId"] 可直接获取顶层字段,但若想获取嵌套在 powerPlant 对象内的 "id",不能写作 "powerPlant.id"(Python 字典不支持点号路径语法),而必须逐层解包:
✅ 正确写法(直接访问):
corr_value = response.json()[0]["powerPlant"]["id"]
⚠️ 但该写法在任意中间键缺失时(如 powerPlant 不存在,或 powerPlant 存在但无 "id" 键)将抛出 KeyError,导致程序中断。
为提升鲁棒性,推荐以下两种更安全的方式:
? 方式一:使用 .get() 方法链式调用(推荐)
利用字典的 .get(key, default) 方法,可指定默认值,避免异常:
data = response.json()
corr_value = data[0].get("powerPlant", {}).get("id", None)
# 若任一环节缺失,返回 None;也可设为 -1、"" 等业务默认值
该方式简洁、可读性强,适合多数场景。
? 方式二:显式异常处理
当需区分不同缺失原因(如记录日志、触发告警)时,使用 try/except:
try:
corr_value = response.json()[0]["powerPlant"]["id"]
except KeyError as e:
print(f"Missing key in JSON response: {e}")
corr_value = None # 或抛出自定义异常
? 额外建议:
- 对生产环境,建议始终对 response.json() 调用加异常处理(如 JSONDecodeError),防止非 JSON 响应;
- 若需频繁访问深层路径,可考虑使用第三方库如 jmespath 或 jsonpath-ng,支持表达式查询(例如 jmespath.search("[][0].powerPlant.id", data));
- 使用类型提示(如 Dict[str, Any])配合 mypy 可在开发阶段提前发现潜在键访问风险。
总之,嵌套 JSON 取值的核心原则是:拒绝硬编码链式方括号,优先采用 .get() 提供默认兜底,兼顾可读性与健壮性。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











