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

Python遍历嵌套JSON出现TypeError 如何提取游戏坦克性能数据存入数据库

错误原因

  1. 结构层级理解错误:你提供的JSON结构中,js['data']['542250529'] 是列表类型,不是字典,直接用字符串'all'作为索引访问列表,就会抛出TypeError: list indices must be integers or slices, not str异常。该列表仅包含1个元素,元素为存储all字段的字典,需要先取列表的第0位元素再访问all。
  2. 响应解析不完整:你提到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:45:04