【问题标题】:Android Retrofit nested JSON objects in arraylistAndroid Retrofit 数组列表中的嵌套 JSON 对象
【发布时间】:2021-11-12 22:56:12
【问题描述】:

我正在使用 PokeApi 创建一个安卓应用。我正在使用 Retrofit 库来解析数据。 我的 API 如下所示:

{
  "abilities": [2 items],
  "base_experience": 64,
  "forms": [1 item],
  "game_indices": [20 items],
  "height": 7,
  "held_items": [],
  "id": 1,
  "is_default": true,
  "location_area_encounters": "https://pokeapi.co/api/v2/pokemon/1/encounters",
  "moves": [78 items],
  "name": "bulbasaur",
  "order": 1,
  "past_types": [], 
  "species": {2 items},
  "sprites": {10 items},
  "weight": 69,
  "stats": [
    {
    "base_stat": 45,
    "effort": 0,
    "stat": {
       "name": "hp",
       "url": "https://pokeapi.co/api/v2/stat/1/"
     }
   },
   {
   "base_stat": 49,
   "effort": 0,
   "stat": {
     "name": "attack",
     "url": "https://pokeapi.co/api/v2/stat/2/"
    }
   },
   .
   ....

}

我能够记录 nameweightheight 等值,但无法将项目作为数组获取,该数组位于值 stats 内。我还需要嵌套在stats 中的statnameurl)。 这就是我所做的。 这些是我的模型类。

public class PokeDetail {

    private String name;
    private String height;
    private String weight;

    @SerializedName("stats")
    @Expose
    private List<PokeStats> stats = null;

    public List<PokeStats> getStats() {
        return stats;
    }

    public void setStats(List<PokeStats> stats) {
        this.stats = stats;
    }

    public String getName() {
        return name;
    }

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

    public String getHeight() {
        return height;
    }

    public void setHeight(String height) {
        this.height = height;
    }

    public String getWeight() {
        return weight;
    }

    public void setWeight(String weight) {
        this.weight = weight;
    }

}

public class PokeStats {

    private String effort;

    public String getEffort() {
        return effort;
    }

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

}

这是我的 MainActivity 的样子:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://pokeapi.co/api/v2/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        PokeApiService pokeApiService = retrofit.create(PokeApiService.class);

        Call<PokeDetail> call = pokeApiService.getPokeDetails(pokeNum);

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

                PokeDetail pokeDetails = response.body();
                Log.i("NAME", pokeDetails.getName());
                Log.i("Height", pokeDetails.getHeight());
                Log.i("Weight", pokeDetails.getWeight());
                List<PokeStats> p = pokeDetails.getStats();
                Log.i("ListDATA", p.toString());

            }

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

这是我的输出:

【问题讨论】:

    标签: java android json api retrofit


    【解决方案1】:

    记录不正确的问题

    您看到的是默认版本的toString,如果您想以自己的方式登录然后覆盖它。请参阅下面的示例类。

    我需要嵌套在 stat 中的 stat(名称和 url)

    您的PokeStats 类中需要有stat 键。

    例子:

    public class PokeStats {
    
        @SerializedName("base_stat")
        @Expose
        private Integer baseStat;
        @SerializedName("effort")
        @Expose
        private Integer effort;
        @SerializedName("stat")
        @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;
        }
    
    
        @Override
        public String toString() {
            return "PokeStats{" +
                    "baseStat=" + baseStat +
                    ", effort=" + effort +
                    ", stat=" + stat.toString() +
                    '}';
        }
    }
    

    & 嵌套的Stat 类:

    public class Stat {
    
        @SerializedName("name")
        @Expose
        private String name;
        @SerializedName("url")
        @Expose
        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;
        }
    
        @Override
        public String toString() {
            return "Stat{" +
                    "name='" + name + '\'' +
                    ", url='" + url + '\'' +
                    '}';
        }
    }
    

    建议:

    如果您需要为此类错误响应创建课程,您可以使用这样的在线工具:https://www.jsonschema2pojo.org/

    输入您的回复并选择JSONGSON 相应选项并生成类。

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 2013-09-29
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多