我刚刚开始使用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()
答案 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
个对象)。