如何安全获取嵌套JSON值并填充缺失值?解决类型报错
问题诊断与解决方案
错误原因分析
objects是数组而非字典:API返回的objects是列表类型,你直接对APResponseJSON.get('objects', {})调用.get('data'),当objects存在时得到的是列表(无get()方法);若objects不存在,默认值设为字符串'field_52',字符串同样没有get()方法,这就是报错的核心原因。- Role字段语法完全错误:你错误混用列表索引与字典
get方法,['objects'][0]实际是取字符串'objects',对字符串调用.get()必然报错。 - 硬索引无容错机制:
APResponseJSON['objects'][0]['data']['field_6']['value']这种写法,只要任意一层键/索引缺失,就会直接抛出KeyError或IndexError。
修正后的代码
import requests import json APResponse = requests.post(APurl, headers=headers, json={'offset': str(AssetPandaCurrentUser), 'limit': '1'}) APResponseJSON = json.loads(APResponse.text) # 安全获取第一个object,不存在则返回空字典 first_object = APResponseJSON.get('objects', [{}])[0] # 从object中获取data节点,不存在则返回空字典 data = first_object.get('data', {}) AssetPandaUserDict = { "Username": data.get('field_52', ''), # 取不到值时返回空字符串 "Role": data.get('field_49', {}).get('value', ''), # 逐层嵌套get,避免类型错误 "User Status": data.get('field_6', {}).get('value', ''), "Laptop Status": [], "Laptop Serial": [] }
关键优化点
- 安全处理列表元素:用
APResponseJSON.get('objects', [{}])[0],即便objects为空或不存在,也能得到空字典,避免索引报错。 - 链式get加类型匹配默认值:每一层调用
.get()时,默认值设为对应类型(字典用{}, 字符串用''),确保后续调用不会因类型不兼容报错。 - 移除不必要的列表包裹:按照你的期望结果,直接取值而非将结果放入列表。
内容的提问来源于stack exchange,提问作者GooseAtCompany
相关产品推荐
相关产品推荐

