Retrofit - Json ответ может содержать различные поля в зависимости от типа - PullRequest
1 голос
/ 09 января 2020

Я работаю над оболочкой API с использованием модернизации, но у меня возникают проблемы с созданием возвращаемых классов объектов, поскольку некоторые элементы из одной и той же конечной точки могут содержать поля различного типа.

Например, возвращающийся JSON может выглядеть следующим образом для базового c предмета:

{
  "name": "Box of Honed Splint Armor",
  "description": "Double-click to unpack a full set of level 50 armor.",
  "type": "Container",
  "level": 0,
  "rarity": "Masterwork",
  "vendor_value": 86,
  "game_types": [
    "Wvw",
    "Dungeon",
    "Pve"
  ],
  "flags": [],
  "restrictions": [],
  "id": 9000,
  "chat_link": "[&AgEoIwAA]",
  "icon": "https://render.guildwars2.com/file/72D04673660ECB7FD904680D487030A41106F952/63218.png",
  "details": {
    "type": "Default"
  }
}

Или вот так для более подробного предмета:

{
  "name": "Strong Soft Wood Longbow of Fire",
  "description": "",
  "type": "Weapon",
  "level": 44,
  "rarity": "Masterwork",
  "vendor_value": 120,
  "default_skin": "3942",
  "game_types": [ "Activity", "Dungeon", "Pve", "Wvw" ],
  "flags": [ "SoulBindOnUse" ],
  "restrictions": [],
  "id": 28445,
  "chat_link":"[&AgEdbwAA]",
  "icon": "https://render.guildwars2.com/file/C6110F52DF5AFE0F00A56F9E143E9732176DDDE9/65015.png",
  "details": {
    "type": "LongBow",
    "damage_type": "Physical",
    "min_power": 385,
    "max_power": 452,
    "defense": 0,
    "infusion_slots": [],
    "infix_upgrade": {
      "attributes": [
        { "attribute": "Power", "modifier": 62 },
        { "attribute": "Precision", "modifier": 44 }
      ]
    },
    "suffix_item_id": 24547,
    "secondary_suffix_item_id": ""
  }
}

Поле данных может очень сильно отличаться между разными типы элементов, и я предпочел бы иметь простой способ доступа к полям, соответствующим каждому типу, без того, чтобы потребитель упаковщика набирал приведение к подклассу c со спецификацией типа пустого базового класса, как этого требуют другие оболочки, например одна из лучших обёрток do.

Есть ли способ скрыть поля в зависимости от типа родителя или чего-то подобного, чтобы я мог включить все возможные поля в класс элементов?

Есть предложения?

1 Ответ

1 голос
/ 09 января 2020

Согласно https://www.baeldung.com/retrofit

Модернизация работает путем моделирования по базовому URL и создания интерфейсов, возвращающих объекты из конечной точки REST.

Для простоты мы собираемся взять небольшую часть JSON путем моделирования нашего класса User, который будет принимать значения, когда мы их получим:

public class User {
    private String login;
    private long id;
    private String url;
    // ...

    // standard getters an setters

}

Мы можем видеть, что мы берем только подмножество свойств для этого примера. Модернизация не будет жаловаться на отсутствующие свойства - поскольку она отображает только то, что нам нужно, она даже не будет жаловаться, если мы добавим свойства, которых нет в JSON.

...