java - 您可以使用 Retrofit 2 和 Gson 将 ISO 8601 时间戳直接映射到 OffsetDateTime 或 ZonedDateTime 吗?

标签 java android gson retrofit2 threetenbp

在 Android 上,使用 Retrofit 2 及其 Gson 转换器,您可以映射 ISO 8601 字符串,如 "2016-10-26T11:36:29.742+03:00"(在后端的 JSON 响应中)直接进入 POJO 中的 java.util.Date 字段.这开箱即用。

现在,我正在使用 ThreeTenABP lib 投入使用(它提供了 java.time 类的向后移植版本),我想知道是否可以将 ISO 时间戳字符串直接映射到更好、更现代的类型,例如 OffsetDateTimeZonedDateTime.

在大多数情况下(想想服务器端的 Java 8),显然,从“2016-10-26T11:36:29.742+03:00”到OffsetDateTimeZonedDateTime 会很简单,因为日期字符串包含时区信息。

我尝试在我的 POJO 中同时使用 OffsetDateTimeZonedDateTime(而不是 Date),但至少开箱即用它不起作用。如果您可以使用 Retrofit 2 在 Android 上干净地做到这一点,您有什么想法吗?

依赖关系:

compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'

compile 'com.jakewharton.threetenabp:threetenabp:1.0.4'

构建 Retrofit 实例:

new Retrofit.Builder()
// ...
.addConverterFactory(GsonConverterFactory.create())
.build();

最佳答案

您可以:

  1. 创建一个实现 JsonDeserializer<T> 的类型适配器并将 JSON 文字转换为您想要的任何 ThreeTen 类型。 LocalDate 的示例:

    @Override
    public LocalDate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            if (typeOfT == LocalDate.class) {
                return LocalDate.parse(json.getAsJsonPrimitive().getAsString(), DateTimeFormatter.ISO_DATE);
            }
        } catch (DateTimeParseException e) {
            throw new JsonParseException(e);
        }
        throw new IllegalArgumentException("unknown type: " + typeOfT);
    }
    

    为您想要的 ThreeTen 类型实现类似留作练习。

  2. GsonBuilder 上注册类型适配器在构建 Gson 时实例:

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(LocalDate.class, new YourTypeAdapter());
    Gson gson = gsonBuilder.create();
    
  3. 注册Gson带有 Retrofit.Builder 的实例:

    builder.addConverterFactory(GsonConverterFactory.create(gson));
    
  4. 在带有 Retrofit 的 Gson 模型类中使用 ThreeTen 类型。

同样,如果你想将 ThreeTen 类型序列化为 JSON,同样实现 JsonSerializer在你的类型适配器中。

关于java - 您可以使用 Retrofit 2 和 Gson 将 ISO 8601 时间戳直接映射到 OffsetDateTime 或 ZonedDateTime 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41486126/

相关文章:

java - Primefaces 树集复选框

java - 如何在 java 中使用 com.google.gson.JsonObject 将值设置为 null?

java - 带有 Retrofit 2 的多个转换器

java - 如何使用 Google Json Parsing API (Gson) 来解析我的 json 中的一些动态字段?

java - Bouncy CastLe PGP 一次性签名和加密?

JavaFX WebView 下载

java - RxJava 中的 concatMap 和 flatMap 有什么区别

android - Android 10 的 BACK 新手势会触发 onKeyDown 吗?

android - 从数组到数据库异常的 jackcess 空字段

android - 以编程方式在所有 API 级别上启用飞行模式 Android