
本文讲解python中从嵌套json结构(如{"powerplant": {"id": 67302}})准确获取深层键值的方法,并提供健壮的异常处理与安全访问策略,避免keyerror。
本文讲解python中从嵌套json结构(如{"powerplant": {"id": 67302}})准确获取深层键值的方法,并提供健壮的异常处理与安全访问策略,避免keyerror。
在调用API后,你常会收到类似如下结构的JSON响应:
[
{
"hpsId": 10032,
"powerPlant": {
"name": "Svartisen",
"id": 67302
}
}
]
此时,response.json() 返回一个 Python 列表(含字典元素),而目标字段 id 并非顶层键,而是嵌套在 "powerPlant" 字典内部。因此,直接写 response.json()[0]["id"] 会触发 KeyError —— 因为顶层字典中根本不存在 "id" 键。
✅ 正确访问方式是链式字典索引:
corr_value = response.json()[0]["powerPlant"]["id"]
这相当于:先取列表第0项 → 再取其 "powerPlant" 字段(返回一个字典)→ 最后取该字典中的 "id" 键。
⚠️ 但生产环境中,API响应可能不稳定:"powerPlant" 字段可能缺失、为空,或其内部不包含 "id"。硬编码索引将导致运行时崩溃。推荐以下两种更健壮的写法:
方法一:使用 .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: {e}")
corr_value = None
except IndexError:
print("Response list is empty or index out of range")
corr_value = None
? 额外建议:
- 若需频繁解析此类结构,可考虑使用 pydantic 或 marshmallow 做类型化反序列化,提升可维护性与类型安全;
- 对于复杂嵌套,也可借助第三方库如 jsonpath-ng 实现 XPath 风格查询(例如 $[0].powerPlant.id);
- 始终对 response.json() 的结果做基础校验(如 isinstance(data, list) 和 len(data) > 0),再进行索引操作。
总之,访问嵌套JSON的关键在于理解数据层级结构,并优先采用 .get() 等防御性编程方式,让代码在面对不完整响应时依然稳定可靠。











