Как связать объекты из массива 1 из слоя глубже - PullRequest
0 голосов
/ 29 февраля 2020

Я хотел бы построить покерный декс, где я мог бы видеть всю информацию обо всех покемонах. Теперь я использую pokedex api https://pokeapi.co/api/v2/pokemon/3 и хочу получить список всех его характеристик с покемоном. json, который я получаю, разделен на 2 объекта

stats": [

    {
        "base_stat": 80,
        "effort": 0,
        "stat": {
            "name": "speed",
            "url": "https://pokeapi.co/api/v2/stat/6/"
        }
    },
    {
        "base_stat": 100,
        "effort": 1,
        "stat": {
            "name": "special-defense",
            "url": "https://pokeapi.co/api/v2/stat/5/"
        }
    },
    ......
]

Таким образом, он не будет автоматически связан с 1 объектом, например:

stats": [

    {
        "base_stat": 80,
        "effort": 0,
        "name": "speed",
        "url": "https://pokeapi.co/api/v2/stat/6/"
    },
    {
        "base_stat": 100,
        "effort": 1,
        "name": "special-defense",
        "url": "https://pokeapi.co/api/v2/stat/5/"
    },
    ......
]

Как я могу это сделать? Я попробовал это, и это работает, но это не похоже на решение.

public class Type {
    private PType type;
    private int base_stat;
    private int effort;

    public Type(PType type, int base_stat, int effort){this.type = type; this.base_stat = base_stat; this.effort = effort;}

    public class PType{
        private String name;
        public String getName() {return this.name;}
    }

    //getters&setters
    ....
}

1 Ответ

0 голосов
/ 02 марта 2020

Используйте TypeAdapter ( javadocs ).

    public static void main(String[] args) {
      String inputJson = "{\"base_stat\": 80,...}";
      Gson gson = new GsonBuilder().registerTypeAdapter(Stats.class, new StatsTypeAdapter()).create();
      Stats stats = gson.fromJson(inputJson, Stats.class);
    }

    class Stats {
      private int baseStat;
      private int effort;
      private String name;
      private String url;

      // getters/setters
    }

    public class StatsTypeAdapter extends TypeAdapter<Stats> {

      private static final JsonParser PARSER = new JsonParser();
      private static final Gson GSON = new GsonBuilder().create();

      @Override
      public void write(JsonWriter out, Stats value) throws IOException {
        if (value == null) {
          out.nullValue();
        } else {
          JsonObject json = new JsonObject();
          // convert back to JSON...
          out.jsonValue(GSON.toJson(json));
        }
      }

      @Override
      public Stats read(JsonReader in) throws IOException {
        JsonObject json = PARSER.parse(in).getAsJsonObject();
        Stats stat = new Stats();
        stat.setBaseStat(json.get("base_effort").getAsInt());
        stat.setEffort(json.get("effort").getAsInt());
        JsonObject statJson = json.getAsJsonObject("stat");
        stat.setName(statJson.get("name").getAsString());
        stat.setUrl(statJson.get("url").getAsString());
      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...