首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能直接将ISO 8601时间戳映射到OffsetDateTime或ZonedDateTime中吗?

您能直接将ISO 8601时间戳映射到OffsetDateTime或ZonedDateTime中吗?
EN

Stack Overflow用户
提问于 2017-01-05 13:17:02
回答 2查看 2.3K关注 0票数 1

在Android上,使用Retrofit 2及其Gson转换器,您可以将ISO8601字符串(在后端的JSON响应中)直接映射到POJO中的java.util.Date字段中。这件事从盒子里干净利落地走出来。

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

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

我尝试在POJO中同时使用OffsetDateTimeZonedDateTime (而不是Date),但至少在开箱即用的情况下,它无法工作。如果你能用Retrofit 2在Android上干净利落地做到这一点,你有什么想法吗?

依赖关系:

代码语言:javascript
复制
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实例:

代码语言:javascript
复制
new Retrofit.Builder()
// ...
.addConverterFactory(GsonConverterFactory.create())
.build();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-05 13:31:41

您可以:

  1. 创建一个实现JsonDeserializer<T>的类型适配器,并将JSON文本转换为您想要的任何ThreeTen类型。LocalDate示例: @重写公共LocalDate反序列化(JsonElement json,Type typeOfT,JsonDeserializationContext上下文)抛出JsonParseException { try { if (typeOfT == LocalDate.class) {返回JsonElement DateTimeFormatter.ISO_DATE);} catch (DateTimeParseException e) {抛出新JsonParseException(e);}抛出新IllegalArgumentException(“未知类型:”+ typeOfT); 对于您想要的ThreeTen类型,实现类似的方法保留为练习。
  2. 在构建GsonBuilder实例时,在Gson上注册类型适配器: gsonBuilder.registerTypeAdapter(LocalDate.class,GsonBuilder gsonBuilder =新的GsonBuilder();
  3. Gson实例注册到Retrofit.Builder: builder.addConverterFactory(GsonConverterFactory.create(gson));
  4. 在您的Gson模型类中使用ThreeTen类型。

类似地,如果要将ThreeTen类型序列化为JSON,也可以在类型适配器中实现JsonSerializer

票数 3
EN

Stack Overflow用户

发布于 2018-01-24 15:13:28

我创建了一个很小的库,它完全按照laalto在他的回答中提出的那样做,请随意使用它:Android时间Gson反序列化器

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41486126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档