【问题标题】:Object inside object with retrofit对象内对象与改造
【发布时间】:2015-11-28 03:29:14
【问题描述】:

我需要像下一个一样发送@Body:

{
  "test": "test",
  "test2": {
       "test2": "test2",
       "test2": "test2",
  },
  "test3": {
       "test3": "test3",
       "test3": "test3",
  },
}

我是改装新手,我知道如何创建简单的@Body 对象,但如何在对象内部创建对象 - 我不知道。

很高兴得到任何帮助!

【问题讨论】:

  • 我不明白。只需将对象放入您的对象中。首先,您如何创建 Body?

标签: android arrays json retrofit


【解决方案1】:

只需为这些内部对象创建类,并将它们聚合为一个对象:

class TestWrapper {

    @Expose
    String test;

    @Expose
    Test2 test2;

    @Expose
    Test3 test3;
}

class Test2 {

    @SerializedName("something_name") // <- this will be the JSON key name
    @Expose
    String something;

    @SerializedName("something_else_name")
    @Expose
    String somethingElse;
}

等等。 然后将TestWrapper 对象作为请求@Body 传递。 此外,并不是在您的 JSON 中您将两个对象命名为相同(“test2”、“test3”)——您不能这样做,键必须是唯一的。 此代码中的注释是 GSON 库注释: @Expose@SerializedName

【讨论】:

  • 值得一提的是,Retrofit 使用 Gson 作为默认的 JSON 转换器,所以上面的解决方案是完美的。
  • 使用 Gson 序列化时,它将使用字段名称作为键,或者,如果使用 @SerializedName("custom_name") 进行注释,则键将是注释中的任何字符串 (在这种情况下:“custom_name”)
  • @invariant,我需要为所有类 Test2 创建 keyName。如何为字符串等创建 keyName - 我知道 :)
  • 我不确定我是否完全理解你,但如果你想为一个类的所有对象使用相同的键,你可以通过为每个对象设置相同的 @SerializedName 来做到这一点,但是不要这样做,原因在答案中指定。键必须是唯一的。 (如果这不是你要求的,你必须更具体)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2021-01-16
  • 2021-03-12
  • 2017-12-29
相关资源
最近更新 更多