【问题标题】:Retrofit - Json response can contain different fields depending on typeRetrofit - Json 响应可以包含不同的字段,具体取决于类型
【发布时间】:2020-01-09 00:12:38
【问题描述】:

我正在使用改造开发 API 包装器,但在创建返回的对象类时遇到问题,因为来自同一端点的某些项目可能包含不同类型的字段。

例如,对于基本项目,返回的 JSON 可能如下所示:

{
  "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": ""
  }
}

不同项目类型之间的详细信息字段可能会有很大差异,我希望有一种简单的方法来访问与每种类型对应的字段,而无需包装器消费者必须将类型转换为空的特定类型子类像其他包装器一样需要基类,比如one of the best wrappers do。

是否有某种方法可以根据父项的类型或类似的方式隐藏字段,以便我可以在项目类中包含所有可能的字段?

有什么建议吗?

【问题讨论】:

  • 我认为改造只在 JSON 中返回的填充字段,所以如果有没有 JSON 值的额外字段(例如基本项),那么它们将为空。
  • @Scary Wombat 最好,如果可能的话,我希望他们根本不在那里。但是如果没有办法,那么包含所有字段的详细信息类是最好的方法。
  • 你可以对item进行更详细的序列化,获取任意字段的值,但首先比较你想获取的字段是否有值。
  • @Scary Wombat 我肯定会选择包含所有字段的详细信息类,所以如果你想把它作为答案,以便我接受它,我会很高兴。谢谢您的帮助。不知道或在文档中找到将缺失值设置为 null 的任何信息。认为它会为此抛出异常。

标签: java android retrofit


【解决方案1】:

根据https://www.baeldung.com/retrofit

Retrofit 通过在基本 URL 上建模并使接口从 REST 端点返回实体来工作。

为简单起见,我们将通过建模我们的 User 类来获取 JSON 的一小部分,该类将在我们收到值时获取值:

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

    // standard getters an setters

}

我们可以看到,对于这个示例,我们只采用了一部分属性。 Retrofit 不会抱怨缺少属性——因为它只映射我们需要的东西,如果我们要添加 JSON 中没有的属性,它甚至不会抱怨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多