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

一次性提取多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:00:35