从API查询的JSON中取值时,如何避免KeyError?使用.get方法遇问题
问题描述
我正在逐个调用API获取用户数据,每个用户会返回包含相关信息的JSON。需要从中提取特定字段构建AssetPandaUserDict字典,但部分用户可能缺少Role、Username这类字段。希望程序在无法找到对应字段时,不为该字典项抛出KeyError异常终止程序,而是将其设为空值。尝试使用.get()方法但写法有误,代码如下:
"Username": [APResponseJSON.get(['objects'][0]['data']['field_52'])]
触发了错误:TypeError: string indices must be integers,请提供解决思路。
原代码示例:
APResponse = requests.request('POST', APurl, headers=headers, json={'offset': str(AssetPandaCurrentUser), 'limit': '1'}) APResponseJSON = APResponse.json() AssetPandaUserDict = { "Username": [APResponseJSON['objects'][0]['data']['field_52']], "Role": [APResponseJSON['objects'][0]['data']['field_49']['value']], "User Status": [APResponseJSON['objects'][0]['data']['field_6']['value']], "Laptop Status": [], "Laptop Serial": [] }
解决思路
错误原因
你的.get()用法完全错误:.get()方法的第一个参数是字符串类型的键名,而你直接传入了['objects'][0]['data']['field_52']——这段代码会先把['objects'](一个包含字符串的列表)取索引0得到字符串"objects",然后试图对字符串"objects"取['data']索引,自然会触发string indices must be integers错误。
正确的安全取值方案
对于嵌套的JSON结构,必须逐层使用.get()处理每个可能不存在的节点,每一层都设置默认值,避免中间节点缺失导致的异常。具体步骤如下:
- 先获取最外层的
objects列表,若不存在则返回空列表; - 判断列表是否有元素,无元素则用空字典替代第一个对象;
- 再从对象中获取
data字典,不存在则返回空字典; - 最后针对每个字段,用
.get()逐层取值,设置合适的默认值(比如空字符串)。
修改后的代码示例
APResponse = requests.request('POST', APurl, headers=headers, json={'offset': str(AssetPandaCurrentUser), 'limit': '1'}) APResponseJSON = APResponse.json() # 逐层安全获取嵌套节点,每一步都设置默认值 objects = APResponseJSON.get('objects', []) first_obj = objects[0] if len(objects) > 0 else {} user_data = first_obj.get('data', {}) AssetPandaUserDict = { "Username": [user_data.get('field_52', '')], "Role": [user_data.get('field_49', {}).get('value', '')], "User Status": [user_data.get('field_6', {}).get('value', '')], "Laptop Status": [], "Laptop Serial": [] }
代码说明
- 若
objects字段不存在或为空列表,first_obj会被设为空字典,避免索引报错; - 若
data字段不存在,user_data会被设为空字典,后续.get()调用不会报错; - 对于
field_52这类直接返回值的字段,用.get('field_52', ''),缺失时返回空字符串; - 对于
field_49这类嵌套value的字段,先通过.get('field_49', {})确保获取到字典(或空字典),再调用.get('value', ''),避免嵌套节点缺失导致的异常; - 所有字段缺失时都会自动设为空字符串,不会抛出KeyError或TypeError,程序可以正常运行。
内容的提问来源于stack exchange,提问作者GooseAtCompany
相关产品推荐
相关产品推荐

