具有多种格式的 Moshi LocalDateTime 适配器

2023-12-19

默认情况下,ThreeTenABP.LocalDateTime 转换为

{"date":{"day":10,"month":4,"year":2018},"time":{"hour":3,"minute":34,"nano":115000000,"second":18}}

我可以编写一个适配器来支持 ISO 日期字符串2018-04-10T03:45:26.009

class LocalDateTimeAdapter {
    @ToJson
    fun toJson(value: LocalDateTime): String {
        return FORMATTER.format(value)
    }

    @FromJson
    fun fromJson(value: String): LocalDateTime {
        return FORMATTER.parse(value, LocalDateTime.FROM)
    }

    companion object {
        private val FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME
    }
}

如何编写一个可以支持这两种格式的适配器(fromJson)

  • {"date":{"day":10,"month":4,"year":2018},"time":{"hour":3,"minute":34,"nano":115000000,"second":18}}
  • 2018-04-10T03:45:26.009

除了确定使用哪种格式之外fromJson,我很好奇Moshi内部如何对LocalDateTime执行toJson/fromJson


你需要使用JsonReader.peek()确定传入 JSON 的格式,然后采取相应的操作。

首先安装一个转换适配器LocalDateTime到一个字符串。该适配器应该使用限定符注释。

@Retention(RetentionPolicy.RUNTIME)
@JsonQualifier
@interface DateString {
}

接下来创建字符串适配器。它应该很简单,并且可以委托给 Moshi 的内置 Rfc3339DateJsonAdapter。

public final class LocalDateAsStringAdapter {
  @ToJson String toJson(@DateString LocalDateTime localDateTime) {
    ...
  }

  @FromJson @DateString LocalDateTime fromJson(String string) {
    ...
  }
}

最后创建一个适配器,将其委托给 Moshi 的内置适配器(该适配器将使用{...}) 或连接到您的字符串适配器。这个更喜欢字符串格式,但你可以做你喜欢的。

public final class MultipleFormatsDateAdapter {
  @ToJson void toJson(JsonWriter writer, LocalDateTime value,
      @DateString JsonAdapter<LocalDateTime> stringAdapter) throws IOException {
    stringAdapter.toJson(writer, value);
  }

  @FromJson LocalDateTime fromJson(JsonReader reader, @DateString JsonAdapter<LocalDateTime> stringAdapter,
      JsonAdapter<LocalDateTime> defaultAdapter) throws IOException {
    if (reader.peek() == JsonReader.Token.STRING) {
      return stringAdapter.fromJson(reader);
    } else {
      return defaultAdapter.fromJson(reader);
    }
  }
}

这是可行的,因为 Moshi 允许您声明多个JsonAdapter的论点@ToJson and @FromJson方法,并且这些参数可以被注释。

如果类型相同,它还依赖于此功能的工作方式。在这里我们制作一个JsonAdapter<LocalDateTime>通过委托给另一个人JsonAdapter<LocalDateTime>。当类型相同时,Moshi 使用其nextAdapter()组成的特征。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有多种格式的 Moshi LocalDateTime 适配器 的相关文章

  • 第一次调用后 LiveData 未观察到

    我实现了 LiveData 和 ViewModel 来模仿 AsyncTaskLoader 我从 DCIM 中的相机目录加载文件名 然后附加一个 fileObserver 来观察删除文件 图片 时的情况 然后回调告诉 LiveData 在发
  • 如何在 GitHub Actions 上运行 Kotlin 脚本?

    我想在 CI 中运行 Kotlin 脚本而不依赖于 Gradle 项目 这样我就可以轻松地执行使用 shell bash batch 难以编程的操作 并且可以在需要时使用库 让 Kotlin 脚本仅在 Ubuntu Linux 上运行是可以
  • Android Studio 中过时的 Kotlin 运行时警告

    下载并安装最新的 Kotlin 插件后 我有过时的 Kotlin 运行时来自 Android Studio 的警告告诉我 您在 kotlin stdlib 1 1 2 库中的 Kotlin 运行时版本是 1 1 2 而插件版本是1 1 2
  • Kotlin 中的数据绑定无法与视图绑定一起使用

    安卓工作室3 6 构建 gradle buildscript ext kotlin version 1 3 50 repositories google jcenter dependencies classpath com android
  • 如何在 IntelliJ 中快速文档中换行文本?

    Ctrl Q 快速文档 后我看不到所有文本 我必须水平滚动才能看到所有内容 我无法使编辑器适合窗口 更新 问题只是符号定义 即 第一行 描述 块文本 正确换行 实际上 我不想调整此窗口的大小 因为我更喜欢将其保留在相同的位置以便快速参考 我
  • LiveData无法观察到变化

    我正在更新一个ViewModel 中 DialogFragment 的 LiveData 值 但无法获取Fragment中的值 视图模型 class OtpViewModel private val otpUseCase OtpUseCas
  • @Service 中带有 Kotlin 的 Spring Boot @Autowired 始终为 null

    目前 我尝试使用 Kotlin 重写我的 Java Spring Boot 应用程序 我遇到了一个问题 在我所有的类中都用 Service依赖注入无法正常工作 所有实例都null 这是一个例子 Service Transactional o
  • DateTimeFormatter 中的通配符

    我需要将一个字符串解析为LocalDate 该字符串看起来像31 03 2016用正则表达式术语 即 表示日期数字后可能有 0 个或多个未知字符 输入 输出示例 31xy 03 2016 gt 2016 03 31 我希望在 DateTim
  • 如何从 Java 类调用 Kotlin 类

    我需要将意图从 java 活动传递到 Kotlin 活动 Java活动ProfileActivity class Intent selectGameIntent new Intent ProfileActivity this kotlin
  • Ktor 如何处理空响应

    我使用 Ktor 和这样的线路myentity client get url 从 API 响应获取并反序列化我的实体 当 API 返回某些内容时它工作正常 但是一旦 API 没有任何可返回的内容并发送 HTTP 204 响应 它就会失败并显
  • 无法从 TemporalAccessor 获取 OffsetDateTime

    当我这样做时 String datum 20130419233512 DateTimeFormatter formatter DateTimeFormatter ofPattern yyyyMMddHHmmss withZone ZoneI
  • 当创建 Android Jetpack Compose AndroidView 的参数发生变化时,如何替换它?

    我有一个应用程序 显示封装在其中的几个不同视图AndroidView 在下面重现的简单示例中 这些只是TextView实例 问题是更改文本 在本例中循环显示三个不同的值 似乎不会更新应用程序显示的内容 sealed class AppVie
  • Java:检查给定日期是否在当前月份内

    我需要检查给定的日期是否在当前月份 我编写了以下代码 但 IDE 提醒我getMonth https docs oracle com javase 7 docs api java util Date html getMonth and ge
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat
  • Android:如何根据视图模型实时数据属性为片段编写单元测试?

    我的片段 UI 中有一个列表视图 其元素集取决于来自视图模型 LiveData 属性的值的状态 我想为片段创建工具测试 该片段包含与该属性的值集相关的 3 个场景测试用例 但我不知道从哪里开始 我的代码应该如下所示 class MyView
  • Kotlin 中的单例类

    我想知道如何在 Kotlin 中创建一个单例类 以便我的 Util 类在每次应用程序执行时仅实例化一次 但是 当我将 Java 类转换为 kotlin 时 生成了以下代码 它是否正确 companion object private var
  • Unix 纪元时间转 Java Date 对象

    我有一个包含以下内容的字符串UNIX 纪元时间 https en wikipedia org wiki Unix time 我需要将其转换为 Java Date 对象 String date 1081157732 DateFormat df
  • Jetpack Compose:制作全屏(绝对定位)组件

    我怎样才能在全屏渲染树的深处制作一个可组合的 类似于Dialog可组合作品 例如 当用户单击图像时 它会显示该图像的全屏预览 而无需更改当前路线 我可以用 CSS 来做到这一点position absolute or position fi
  • 来自java的kotlin函数默认参数

    给出以下 Kotlin 类 class Foo public fun bar i Int 0 Int 2 i 我应该如何在没有 java groovy 代码中的任何参数的情况下调用 bar 函数 def f new Foo f bar th
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu

随机推荐

  • android.util.Base64 编码/解码标志参数

    根据 Javadoc android util Base64 decode 采用两个参数 文本和 flags 这些标志是 int 形式并且 我引用 flags controls certain features of the decoded
  • 如何在事件上使用 RxJs 和 Socket.IO

    我想在我的内部使用 RxJSsocket on sense function data 我对可用的文档很少以及对 RxJS 缺乏了解感到困惑和困惑 这是我的问题 我有一个distSensor js有一个函数 pingEnd function
  • 如何创建具有不同部分、不同颜色的圆角矩形

    要求 我如何创建一个像这样的视图 我想在屏幕上绘制一个视图 该视图是一条分成几段的线 显示整个视图的值百分比 我的要求是 视图有不同颜色的不同部分 视图可能不会渲染所有部分 它可能只有前 2 个或第一个和最后一个或只有单一颜色等 这仅在运行
  • 在无头模式下运行 WinDbg

    有没有办法让 WinDbg 处于纯无头模式 我的用例是 我应该能够在命令行上模拟 analyze v 命令进行小型转储 而无需启动 WinDbg GUI 使用 Windows 调试工具 还可以cdb 控制台调试器 要调试故障转储 请使用 z
  • firebase 分析中的 user_engagement 事件是如何生成的?

    我看到一个名为firebase screen class 随着engagement time msec firebase event origin and firebase screen id 在里面user engagementbigQu
  • “ng 新的我的应用程序”错误

    我正在尝试使用最新版本的 Angular 生成一个新项目和骨架应用程序 我尝试使用以下命令卸载并重新安装 Angular CLI C gt npm install g angular cli latest C gt ng version a
  • 为什么 WinDbg、任务管理器和 VS 调试器报告的线程数不同?

    当我的 Net 3 5 应用程序运行时 Windows 任务管理器显示我的应用程序有 16 个线程 我收集了该进程的内存转储并使用 WinDbg SOS 打开它 运行 threads 命令显示我有 ThreadCount 456 Unsta
  • 如何将 2 个 zip 文件合并为 1 个?

    我有 2 个 zip 文件 zip1 和 zip2 我需要将这些文件合并为一个 我该如何解决 我知道我可以修复它 将 ZIP1 解压到临时文件夹 然后将其添加到 zip2 但我认为效率很低 更快的方法是什么 我在用着System IO Co
  • Android:创建自定义资源类

    Android 上的 R 类有其局限性 您不能动态使用资源来加载音频 图片或其他内容 例如 如果您不想为选定的对象加载一组音频文件 则您不能执行以下操作 R raw string upon choosen object 我是 android
  • Jenkins 签出 GIT 项目失败,权限被拒绝致命:无法分叉

    我有一个 Freestyle Jenkins 项目 它使用 bitbucket 作为 SCM 使用 ssh 作为协议和私钥 不是用户 密码 当我在 master 上构建项目时 它失败并显示以下堆栈跟踪 而它在代理上运行良好 注意错误提到 s
  • X-Frame-Options 禁止 Facebook 应用程序错误

    我正在构建一个 Facebook 应用程序 目前它处于沙盒模式 我的代码 索引 php
  • Slick 3.0如何更新变量列列表,哪个数字只有在运行时才知道

    是否可以更新变量列列表 其中的数字仅在运行时由 slick 3 0 知道 下面是我想要做的示例 不会编译 var q Query UserTable UserTable TableElementType Seq userTable var
  • 隐式参数和函数

    我在考虑 Haskell GHC 中的隐式参数时遇到问题 我有一个函数f 假设隐式参数x 并希望通过应用将其封装在上下文中f to g f x Int gt Int gt Int f n n x g Int gt Int gt Int gt
  • 如何用范围填充可变参数?

    填充可变参数的正确方法是什么 我的尝试看起来像自行车 首先我构建范围然后我将其转换为列表然后到 intarray然后传播它 m getColumns count count 35 toList toIntArray 其中 getColumn
  • 将字符串插入工作表会导致插入数字

    在我的 Google Apps 脚本中 我在电子表格中添加了一行 在附加的这一行中 我尝试插入一个值 0102 的字符串 但是插入时它会转换为数字 102 有没有什么方法可以使用 Google Apps 脚本将值插入到工作表中 而不会格式化
  • Ubuntu 自动从 Github 存储库中拉取

    我在我的服务器上安装了 git 但我希望每当我推送本地所做的更改时它都会从我的 github 存储库中提取 我研究过钩子 但它非常令人困惑 而且我找不到任何教程 有谁知道这是怎么做到的吗 我希望我的服务器在每次提交后从存储库中提取 这看起来
  • JPA 和 PostgreSQL 与 GenerationType.IDENTITY

    我有关于 Postgres 和 GenerationType Identity 与 Sequence 的问题 在这个例子中 Id SequenceGenerator name mytable id seq sequenceName myta
  • PySpark Worker 中 rdd.collect() 上的 ModuleNotFoundError

    我正在 python 中运行 Apache Spark 程序 并且收到一个我无法理解且无法开始调试的错误 我有一个驱动程序 它在名为 hound py 的文件中定义了一个名为 hound 的函数 在同一目录中 我有一个名为 hound ba
  • PHP Websocket 在测试中验证用户身份(传递会话 cookie)

    我正在尝试测试一个场景 一方面 匿名用户应立即断开与 Websocket 连接的连接 另一方面 经过身份验证的用户应保持 Websocket 连接 第一种情况很容易使用下面的代码进行测试 身份验证过程不起作用 对于会话存储 我将 Cooki
  • 具有多种格式的 Moshi LocalDateTime 适配器

    默认情况下 ThreeTenABP LocalDateTime 转换为 date day 10 month 4 year 2018 time hour 3 minute 34 nano 115000000 second 18 我可以编写一个