Retrofit2指定根元素并转换数据类型

时间:2017-01-24 00:37:27

标签: android json retrofit2

我刚刚开始使用Retrofit2和API消费包裹所有有效的回复#34;响应"对象如下图所示。我需要告诉Retrofit只解析响应中的值而不实际将它们嵌套在另一个对象中。对于登录代码,我还面临获取我想要转换为实际时间戳的String的问题。

这是来自登录请求的示例回复:

token
expires 

在上面,只有两个实际值是:

public class Token {

  @SerializedName("token")
  String token;

  @SerializedName("expires")
  Timestamp expires;

  public User(String token, String expires ) {
    this.token
    this.expires = //conversion code omitted. 
  }
}

我希望最终得到如下所示的内容。

sendSpecialChat.toUpperCase()

1 个答案:

答案 0 :(得分:2)

你有几个选择。您可以使用自定义序列化器/反序列化器,键入适配器,也可以只使用pojos并自行解包结果。

让我先从我能想到的最简单的解决方案开始。想象你有这些课程:

public class ResponseData<T> {
    @SerializedName("status")
    @Expose
    String status;
    @SerializedName("response")
    @Expose
    T response;

    public T getResponse() {
      return response;
    }
    // getters and setters and friends
}

public class Token {
    @SerializedName("token")
    @Expose
    String token;

    @SerializedName("expires")
    @Expose
    Timestamp expires;

    public Token(String token, String expires) {
        this.token = token;
        this.expires = expires;
    }
}

首先要注意的是使用@Expose。这是一个很好的,但不是非常必要的。当您拥有自定义序列化程序时,它可以帮助您。

我假设您可以有多个api端点返回相同类型的主体,其中json是:

{  
 "status":"success",
 "response":{  
  // Can be anything
 }
}

正如您所看到的,响应可以是任何事情。

然后,您可以让改装调用返回ResponseData<Token>,在回调中,您可以检查status的值,看看是否可以getResponse解压缩结果。这种方法的优点是您可以非常轻松地重用ResponseData

另一种方法是使用自定义序列化程序或类型适配器。在我看来,这更加费力,但仍然是一种有效的方法。我认为这里的answer非常广泛,并解释了如何在response内获取嵌套对象。

要准备改造以使用类型适配器,您需要将已配置的Gson实例注入其中。以下是:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Token.class, new YourTypeAdapter())
    .create();

Retrofit retrofit = new Retrofit.Builder()
   .addConverterFactory(GsonConverterFactory.create(gson))
   // ....

如您所见,我们将创建的gson与您的类型适配器一起传递给改造使用的GsonConverterFactory。这准备了使用给定类型适配器对Token个对象进行序列化和反序列化的改进。

我认为这种方法的主要缺点是,如果你想编写一个通用的deserialiser / serialiser / typeadapter,它会很快变得复杂(假设你不会只有Token个对象)。