Android модифицирует вложенные объекты JSON в arraylist

#java #android #json #api #retrofit

Вопрос:

Я использую PokeApi для создания приложения для Android. Я использую модифицированную библиотеку для анализа данных. Мой 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/"
    }
   },
   .
   ....

}
 

Я могу регистрировать такие значения , как name weight и height , но не могу получить элементы в виде массива, который находится внутри значения stats . Также мне нужен stat ( name и url ), который вложен внутрь stats .
Вот что я сделал.
Это мои Классы моделей.

 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;
    }

}
 

Вот как выглядит моя основная деятельность:

 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());
            }
        });
 

И вот мой вывод:
введите описание изображения здесь

Ответ №1:

Журнал не является правильной проблемой

То, что вы видите, — это версия по умолчанию toString , если вы хотите, чтобы вход был на вашем пути, затем переопределите его. Смотрите пример класса ниже.

Мне нужна статистика (имя и URL), которая вложена в статистику

У вас должен быть stat ключ внутри вашего PokeStats класса.

Пример:

 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()  
                '}';
    }
}
 

amp; вложенный 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/

Введите свой ответ и выбор JSON , GSON такие параметры соответственно и просто создайте классы.