提问人:Jonik 提问时间:1/5/2017 最后编辑:Jonik 更新时间:10/30/2018 访问量:2693
您可以使用 Retrofit 2 和 Gson 直接将 ISO 8601 时间戳映射到 OffsetDateTime 或 ZonedDateTime 吗?
Can you directly map ISO 8601 timestamps into OffsetDateTime or ZonedDateTime with Retrofit 2 and Gson?
问:
在 Android 上,使用 Retrofit 2 及其 Gson 转换器,您可以映射
ISO 8601 字符串(如(在后端的 JSON 响应中)直接放入 POJO 中的字段中。这开箱即用。"2016-10-26T11:36:29.742+03:00"
java.util.Date
现在,我正在使用 ThreeTenABP 库(它提供了 java.time 类的向后移植版本),我想知道是否可以将 ISO 时间戳字符串直接映射到更好、更现代的类型,例如 or 。OffsetDateTime
ZonedDateTime
在大多数情况下(想想服务器端的 Java 8),显然,从 “” 到 or 的转换会很简单,因为日期字符串包含时区信息。2016-10-26T11:36:29.742+03:00
OffsetDateTime
ZonedDateTime
我尝试在我的 POJO 中使用 和 (而不是 Date),但至少开箱即用它不起作用。如果您可以使用 Retrofit 2 在 Android 上干净利落地做到这一点,您有什么想法吗?OffsetDateTime
ZonedDateTime
依赖:
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();
答:
您可以:
创建一个类型适配器,用于实现 JSON 文本并将其转换为所需的任何 ThreeTen 类型。示例:
JsonDeserializer<T>
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 类型实现类似的内容,则保留为练习。
在构建实例时注册类型适配器:
GsonBuilder
Gson
GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new YourTypeAdapter()); Gson gson = gsonBuilder.create();
将实例注册到:
Gson
Retrofit.Builder
builder.addConverterFactory(GsonConverterFactory.create(gson));
将 Gson 模型类中的 ThreeTen 类型与 Retrofit 结合使用。
同样,如果要将 ThreeTen 类型序列化为 JSON,也请在类型适配器中实现。JsonSerializer
我创建了一个小型库,它完全按照 laalto 在他的答案中提出的建议,请随意使用它:Android Java Time Gson 解序列器
评论