在Android上,使用Retrofit 2及其Gson转换器,您可以将ISO8601字符串(在后端的JSON响应中)直接映射到POJO中的java.util.Date字段中。这件事从盒子里干净利落地走出来。
现在,我正在使用ThreeTenABP库(它提供java.time类的后端版本),我想知道是否有可能将ISO时间戳字符串直接映射到更好、更现代的类型,例如OffsetDateTime或ZonedDateTime。
在大多数情况下(考虑服务器端的Java 8),从“2016-10-26T11:36:29.742+03:00”到OffsetDateTime或ZonedDateTime的转换很简单,因为日期字符串包含时区信息。
我尝试在POJO中同时使用OffsetDateTime和ZonedDateTime (而不是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();发布于 2017-01-05 13:31:41
您可以:
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类型,实现类似的方法保留为练习。GsonBuilder实例时,在Gson上注册类型适配器:
gsonBuilder.registerTypeAdapter(LocalDate.class,GsonBuilder gsonBuilder =新的GsonBuilder();Gson实例注册到Retrofit.Builder:
builder.addConverterFactory(GsonConverterFactory.create(gson));类似地,如果要将ThreeTen类型序列化为JSON,也可以在类型适配器中实现JsonSerializer。
发布于 2018-01-24 15:13:28
我创建了一个很小的库,它完全按照laalto在他的回答中提出的那样做,请随意使用它:Android时间Gson反序列化器。
https://stackoverflow.com/questions/41486126
复制相似问题