我刚刚开始使用 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
相当容易。
另一种方法是使用自定义序列化程序或类型适配器。我认为这更费力,但仍然是一种有效的方法。我认为 answer这里非常广泛,并解释了如何执行此操作以获取 response
中的嵌套对象.
要准备改造以使用类型适配器,您需要注入(inject)已配置的 Gson
例入其中。方法如下:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Token.class, new YourTypeAdapter())
.create();
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
// ....
如您所见,我们将使用您的类型适配器创建的 gson 传递给 GsonConverterFactory
改造使用。这准备改造序列化和反序列化Token
使用给定类型适配器的对象。
我认为这种方法的主要缺点是,如果您想编写一个通用的反序列化器/序列化器/类型适配器,它会很快变得复杂(假设您不会只有一个 Token
对象)。
关于android - Retrofit2 指定根元素并转换数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41818144/