android - 使用 Moshi 将字符串日期从 json 转换为 Date 对象

标签 android retrofit2 moshi

使用 Gson 你会这样做

Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd'T'HH:mm")
            .create();

并将它传递给改造构建器,Gson 会为您创建一个 Date 对象,有没有什么方法可以让 Moshi 在 kotlin 类中也这样做?

最佳答案

如果您想使用标准的 ISO-8601/RFC 3339 日期适配器(您可能会这样做),那么您可以使用内置适配器:

Moshi moshi = new Moshi.Builder()
    .add(Date.class, new Rfc3339DateJsonAdapter().nullSafe())
    .build();

JsonAdapter<Date> dateAdapter = moshi.adapter(Date.class);
assertThat(dateAdapter.fromJson("\"1985-04-12T23:20:50.52Z\""))
    .isEqualTo(newDate(1985, 4, 12, 23, 20, 50, 520, 0));

您需要这个 Maven 依赖项才能使其工作:

<dependency>
  <groupId>com.squareup.moshi</groupId>
  <artifactId>moshi-adapters</artifactId>
  <version>1.5.0</version>
</dependency>

如果您想使用自定义格式(您可能不想),还有更多代码。编写一个接受日期并将其格式化为字符串的方法,以及另一个接受字符串并将其解析为日期的方法。

Object customDateAdapter = new Object() {
  final DateFormat dateFormat;
  {
    dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
  }

  @ToJson synchronized String dateToJson(Date d) {
    return dateFormat.format(d);
  }

  @FromJson synchronized Date dateToJson(String s) throws ParseException {
    return dateFormat.parse(s);
  }
};

Moshi moshi = new Moshi.Builder()
    .add(customDateAdapter)
    .build();

JsonAdapter<Date> dateAdapter = moshi.adapter(Date.class);
assertThat(dateAdapter.fromJson("\"1985-04-12T23:20\""))
    .isEqualTo(newDate(1985, 4, 12, 23, 20, 0, 0, 0));

您需要记住使用synchronized,因为SimpleDateFormat 不是线程安全的。您还需要为 SimpleDateFormat 配置时区。

关于android - 使用 Moshi 将字符串日期从 json 转换为 Date 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44464550/

相关文章:

android - 带有默认值的 Kotlin-moshi 代码生成继承

json - (Kotlin 中的 Moshi)@Json 与 @field :Json

android - 捕获android中的所有异常(xamarin)

android - 我们可以将什么作为音频文件的 okhttp3 MediaType.parse 方法的参数?

android - 使用 okhttp-signpost 改造 OAuth 签名获取特殊字符的 OAuthMessageSignerException

Moshi:PolymorphicJsonAdapterFactory 是否可以获取 withDefaultValue 中的类型?

Android 电话接听器不起作用

android - 如何向默认的 android 键盘添加一行额外的键?

android - 如何将点击监听器添加到轮播项目

android - 使用 Paging 库示例的 Proguard 问题(在 Google Codelabs 中)