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

标签 android json retrofit2

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

相关文章:

android - 为什么 RxJava 经常与 Retrofit 一起使用?

android - 改造响应问题

android - 无法使用 Cordova CLI 7.0.0 添加平台

android从activity返回fragment

arrays - 将 bash 数组转换为 json 数组并使用 jq 插入到文件中

ios - NSJSONSerialization可以处理null吗?

java.lang.NullPointerException : Attempt to invoke virtual method on a null object reference Retrofit

android - 有趣的安卓触摸问题

android - 没有Android项目的Android NDK库如何

javascript - 从/到 Javascript 字符串从 Go int64/uint64 序列化反序列化