[英]Retrofit2 Specify root element and convert datatype
我刚刚开始使用 Retrofit2,我正在使用的 API 将所有有效响应包装在一个“响应”对象中,如下所示。 我需要告诉 Retrofit 只解析响应中的值,而不实际将它们嵌套在另一个对象中。 对于登录代码,我还面临获取字符串的问题,我想将其转换为实际时间戳。
这是来自登录请求的示例响应:
{
"status":"success",
"response":{
"token":"test_token",
"expires":"1485217863"
}
}
在上面只有两个实际值是:
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.
}
}
你在这里有几个选择。 您可以使用自定义序列化器/反序列化器、类型适配器,或者您可以简单地使用 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
。
另一种方法是使用自定义序列化程序或类型适配器。 在我看来,这更费力,但仍然是一种有效的方法。 我认为这里的答案非常广泛,并解释了如何执行此操作以在response
获取嵌套对象。
要准备改造以使用类型适配器,您需要将配置的Gson
实例注入其中。 就是这样:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Token.class, new YourTypeAdapter())
.create();
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
// ....
如您所见,我们将创建的带有类型适配器的GsonConverterFactory
给改造使用的GsonConverterFactory
。 这准备改造以使用给定的类型适配器序列化和反序列化Token
对象。
我认为这种方法的主要缺点是,如果你想编写一个通用的反序列化器/序列化器/类型适配器,它会很快变得复杂(假设你不会只有一个Token
对象)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.