当前位置: 首页 > 知识库问答 >
问题:

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

华俊贤
2023-03-14

我刚刚开始使用Retrofit2,我使用的API将所有有效的响应包装在一个“Response”对象中,如下所示。我需要告诉Retrofit只解析response中的值,而不实际将它们嵌套在另一个对象中。对于登录代码,我还面临着获取一个字符串的问题,我希望将其转换为实际的时间戳。

{  
   "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. 
  }
}

共有1个答案

长孙章横
2023-03-14

你有几个选择。您可以使用自定义序列化/反序列化程序、类型适配器,也可以简单地使用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的使用。这是一个很好的拥有,但不是非常必要的。当您有自定义序列化程序时,它会帮助您。

{  
 "status":"success",
 "response":{  
  // Can be anything
 }
}
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Token.class, new YourTypeAdapter())
    .create();

Retrofit retrofit = new Retrofit.Builder()
   .addConverterFactory(GsonConverterFactory.create(gson))
   // ....

正如您所看到的,我们将创建的gson与您的类型适配器一起传递给Referfit使用的GSONConverterFactory。这为使用给定的类型适配器序列化和反序列化token对象做好了准备。

我认为这种方法的主要缺点是,如果您想要编写一个通用的反序列化程序/Serialiser/TypeAdapter,它会变得非常复杂(假设您不是只有标记对象)。

 类似资料:
  • 我创建了这样一个熊猫系列:

  • JavaScript是一种动态类型语言,变量是没有类型的,可以随时赋予任意值。但是,数据本身和各种运算是有类型的,因此运算时变量需要转换类型。大多数情况下,这种数据类型转换是自动的,但是有时也需要手动强制转换。 强制转换 Number函数:强制转换成数值 String函数:强制转换成字符串 Boolean函数:强制转换成布尔值 自动转换 自动转换为布尔值 自动转换为字符串 自动转换为数值 小结 加

  • 问题内容: 我有一个样式规则,当它具有 两个类时,我想将其应用于标签。没有JavaScript,有什么方法可以执行此操作吗?换一种说法: 我想申请我的样式规则 仅 如果有两个及类应用。 问题答案: 你是说两节课?“束缚”选择器(它们之间没有空格): 这将选择与所有元素也有。 在您的情况下: 官方文档:CSS2类选择器。 正如 akamike 指出的那样,InternetExplorer6中此方法存

  • 我想通过另一个模板参数来指定模板化函数的返回类型。所有这些都在一个类中。 在头文件中:

  • 问题内容: 我的数据库是Postgres8。我需要将数据类型转换为另一个。这意味着column数据类型之一是并且需要在语句中将其与Postgres一起转换。 当前,我获取字符串值并将其转换为Java语言。 有什么办法吗?示例代码将不胜感激。 问题答案: cast(varchar_col AS int) – SQL standard 要么 这些语法变体在 任何地方 (几乎)都有效。第二种在特殊情况下