Python如何从控制台返回的JSON数据中提取指定值并解决KeyError报错
问题原因
你触发KeyError: 'attributes'的核心原因是返回结构中的data字段为列表类型,你直接对列表对象取['attributes']键,自然找不到对应字段。
从你给出的返回结构可以看到,data字段被方括号包裹,列表内的第一个元素才是包含attributes的用户数据字典:
{ 'object': 'list', # data是列表,不是字典 'data': [ {'object': 'user', 'attributes': {'id': 1, '其他字段': '...'}} ], 'meta': {'pagination': '...'} }
正确取值代码
情况1:list_users为同步方法
async def gouser(ctx): tes = clientp.user.list_users("test@gmail.com") # 先取data列表的第1个元素(下标为0),再取attributes下的id user_id = tes['data'][0]['attributes']['id'] print(user_id)
情况2:list_users为异步方法
如果调用后拿到的是协程对象而非实际数据,需要加await关键字获取返回结果:
async def gouser(ctx): tes = await clientp.user.list_users("test@gmail.com") user_id = tes['data'][0]['attributes']['id'] print(user_id)
健壮性优化
如果存在查询结果为空的场景,可以增加判空逻辑避免下标越界报错:
async def gouser(ctx): tes = await clientp.user.list_users("test@gmail.com") data_list = tes.get('data', []) if data_list: user_id = data_list[0]['attributes']['id'] print(user_id) else: print("未匹配到对应用户数据")
注意:不要使用id作为变量名,id是Python内置函数,自定义变量会覆盖原有功能,建议替换为user_id这类命名。
内容的提问来源于stack exchange,提问作者Axel Garcia
相关产品推荐
相关产品推荐

