一次性提取多个JSON键遇TypeError报错,求解决方案
解决多JSON键提取时的TypeError问题
嘿,这个问题我太熟了——之前帮好几个开发者排查过类似的情况!咱们先拆解一下这个错误到底是咋回事,再一步步搞定它。
错误原因先搞懂
TypeError: list indices must be integers or slices, not str 这个报错直白点说:你把列表(list)当成字典(dict)来用了。
举个例子:你本来以为从接口拿到的是一个像 {"name": "张三", "age": 25} 这样的字典对象,结果实际返回的是一个列表,比如 [{"name": "张三", "age": 25}]。这时候你如果直接写 response['name'],就会触发这个错误——因为列表只能用数字索引(比如response[0]),不能用字符串当键。
一步步解决思路
1. 先确认JSON响应的真实结构
先暂停多键提取的逻辑,单独打印出单个消息ID返回的完整JSON响应,看看它的层级结构:
# 先拿一个测试用的消息ID test_msg_id = msg_id_list[0] response = get_json_response(test_msg_id) # 替换成你获取响应的函数 print("响应类型:", type(response)) print("响应内容:", response)
通过这个输出,你能明确:
- 响应是单个字典,还是包含多个字典的列表?
- 目标键是在顶层字典里,还是嵌套在某个子字段里?
2. 根据结构调整多键提取逻辑
情况A:每个消息ID返回单个字典
这是最理想的情况,直接遍历目标键列表提取就行:
target_keys = ['key1', 'key2', 'key3'] # 替换成你要提取的键 for msg_id in msg_id_list: response = get_json_response(msg_id) # 用字典推导式批量提取键,get方法避免键不存在时报错 extracted_data = {key: response.get(key, "无数据") for key in target_keys} # 这里处理提取到的数据,比如存到列表或文件 print(f"消息ID {msg_id} 提取结果: {extracted_data}")
情况B:每个消息ID返回的是列表(包含多个字典)
这种情况你需要先遍历列表里的每个字典,再提取键:
target_keys = ['key1', 'key2', 'key3'] for msg_id in msg_id_list: response_list = get_json_response(msg_id) # 先确认返回的是列表 if isinstance(response_list, list): for item in response_list: # 确保每个item是字典再提取 if isinstance(item, dict): extracted_data = {key: item.get(key, "无数据") for key in target_keys} print(f"消息ID {msg_id} 的子项提取结果: {extracted_data}") else: print(f"警告:消息ID {msg_id} 中的{item}不是字典,跳过") else: print(f"警告:消息ID {msg_id} 的响应不是列表,无法提取")
3. 加容错处理避免崩溃
- 永远用
dict.get(key, 默认值)代替直接dict[key]:前者在键不存在时会返回你指定的默认值(比如"无数据"),而后者会直接抛出KeyError。 - 加类型检查:用
isinstance(obj, dict)或isinstance(obj, list)确认你要操作的对象类型,避免因为接口返回格式变化导致脚本崩溃。
4. 调试小技巧
如果还是搞不清哪里出问题,就在报错的代码行之前,打印出你要操作的变量的类型和内容:
# 比如报错行是extracted_data = {key: response[key] for key in target_keys} print("当前response的类型:", type(response)) print("当前response的内容:", response) # 再执行提取逻辑
这样你就能一眼看出是不是把列表当成字典用了。
内容的提问来源于stack exchange,提问作者Robert Millard
相关产品推荐
相关产品推荐

