繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM