Python遍历嵌套JSON出现TypeError 如何提取游戏坦克性能数据存入数据库
错误原因
- 结构层级理解错误:你提供的JSON结构中,
js['data']['542250529']是列表类型,不是字典,直接用字符串'all'作为索引访问列表,就会抛出TypeError: list indices must be integers or slices, not str异常。该列表仅包含1个元素,元素为存储all字段的字典,需要先取列表的第0位元素再访问all。 - 响应解析不完整:你提到
print(js['data']['542250529'])返回字符串,说明你调用接口后没有正确将响应体解析为Python嵌套对象,大概率是只取了响应文本没有执行JSON解析操作。
解决方案
1. 基础修复(适配单个固定tank_id)
如果你每次只请求单个tank_id,直接调整索引层级即可:
def api_get(): # 先取列表第0位,再访问all字段 all_metrics = js['data']['542250529'][0]['all'] # 直接从字典中取值,无需遍历 spotted = all_metrics['spotted'] battles_on_stunning_vehicles = all_metrics['battles_on_stunning_vehicles'] # 其他字段同理 insert_to_db(spotted, battles_on_stunning_vehicles, ......)
2. 批量适配方案(推荐,兼容多tank_id采集+异常解析处理)
针对你需要采集数百款坦克的场景,建议用如下更通用的实现,同时解决响应字符串无法解析的问题:
import ast import requests # 你的数据库插入方法,这里仅做示例 def insert_to_db(tank_id, **metrics): # metrics 就是all下的所有性能指标字典,字段名和数据库完全对应即可直接插入 # 可以根据你用的数据库驱动/ORM调整实现逻辑 pass def api_get(tank_id: str): # 发起POST请求 resp = requests.post( url="你的游戏API接口地址", data={"tank_id": tank_id} # 根据接口要求调整请求参数格式 ) # 兼容处理异常JSON格式 try: js = resp.json() except Exception as e: # 标准JSON解析失败时,用ast处理带转义的类JSON字符串 js = ast.literal_eval(resp.text.strip()) # 遍历data下的所有tank_id数据,支持单次请求传多个tank_id的场景 for tid, data_list in js["data"].items(): # 取列表第一个元素的all字段 all_metrics = data_list[0]["all"] # 自动展开所有性能指标插入数据库,无需手动赋值几十个字段 insert_to_db( tank_id=tid, **all_metrics )
注意事项
- 只要你的数据库表字段名和
all字段下的key完全一致,用**all_metrics自动展开的方式可以省去几十个字段的手动赋值代码,降低出错概率 - 如果接口返回的列表长度可能大于1,你可以再加一层遍历处理
data_list中的所有元素
内容的提问来源于stack exchange,提问作者Master Schifou
相关产品推荐
相关产品推荐

