gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:37:41 26 4
gpt4 key购买 nike

我刚刚开始使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com