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

Android Retrofit解析PokeApi时无法获取stats嵌套数组内容问题

问题原因

你的PokeStats模型类没有完整映射接口返回的所有字段,也没有定义嵌套的stat对象对应的模型,Gson解析时只会给已有的effort字段赋值,其他字段缺失;同时直接打印列表的toString方法默认只会输出对象内存地址,看不到实际内容。


修改步骤

1. 新增嵌套的Stat模型类

新建Stat.java,对应stats数组每个元素内部的stat对象:

public class Stat {
    private String name;
    private String url;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

2. 补全PokeStats模型类

修改你现有的PokeStats.java,补全所有返回字段和嵌套的Stat对象:

import com.google.gson.annotations.SerializedName;
import com.google.gson.annotations.Expose;

public class PokeStats {
    @SerializedName("base_stat")
    @Expose
    private Integer baseStat;
    @Expose
    private Integer effort;
    @Expose
    private Stat stat;

    public Integer getBaseStat() {
        return baseStat;
    }

    public void setBaseStat(Integer baseStat) {
        this.baseStat = baseStat;
    }

    public Integer getEffort() {
        return effort;
    }

    public void setEffort(Integer effort) {
        this.effort = effort;
    }

    public Stat getStat() {
        return stat;
    }

    public void setStat(Stat stat) {
        this.stat = stat;
    }
}

3. 修改MainActivity的打印逻辑

遍历列表获取每个元素的字段值,不要直接打印列表的toString:

call.enqueue(new Callback<PokeDetail>() {
    @Override
    public void onResponse(Call<PokeDetail> call, Response<PokeDetail> response) {
        if(!response.isSuccessful()){
            Log.i("ERROR", "onResponse: " + response.code());
            return;
        }

        PokeDetail pokeDetails = response.body();
        Log.i("NAME", pokeDetails.getName());
        Log.i("Height", pokeDetails.getHeight());
        Log.i("Weight", pokeDetails.getWeight());
        List<PokeStats> statsList = pokeDetails.getStats();
        // 遍历打印所有属性
        for (PokeStats stats : statsList) {
            Log.i("STATS", "基础值:" + stats.getBaseStat() 
                + " 努力值:" + stats.getEffort() 
                + " 属性名:" + stats.getStat().getName() 
                + " 属性链接:" + stats.getStat().getUrl());
        }
    }

    @Override
    public void onFailure(Call<PokeDetail> call, Throwable t) {
        Log.i("ERROR", t.getMessage());
    }
});

额外优化建议:你可以把PokeDetail里的height、weight字段类型从String改成Integer,接口返回的这两个字段本身是数字类型,用String虽然也能解析,但后续做计算时还需要额外转换类型。

内容的提问来源于stack exchange,提问作者SIDDHARTH SINGH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:09:02