You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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()处理每个可能不存在的节点,每一层都设置默认值,避免中间节点缺失导致的异常。具体步骤如下:

  1. 先获取最外层的objects列表,若不存在则返回空列表;
  2. 判断列表是否有元素,无元素则用空字典替代第一个对象;
  3. 再从对象中获取data字典,不存在则返回空字典;
  4. 最后针对每个字段,用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:55:22