【发布时间】:2018-10-23 19:59:13
【问题描述】:
我正在使用 Circe 进行 json 操作。我添加了自定义编码器和解码器来处理一些类型,比如 Joda Time。
在解析 DateTime 时,我想允许传递多种格式。
例如。 dd-MM-yyyy'T'HH:mm:ss'Z' 和 dd-MM-yyyy'T'HH:mm:ss.SSS'Z'
我已经定义了我的解码器,如下所示:
val dateTimeFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")
val dateTimeFormatWithMillis = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
implicit val jodaDateTimeFormat: Encoder[DateTime] with Decoder[DateTime] = new Encoder[DateTime] with Decoder[DateTime] {
override def apply(a: DateTime): Json = Encoder.encodeString(a.toString("yyyy-MM-dd'T'HH:mm:ss'Z'"))
override def apply(c: HCursor): Result[DateTime] = Decoder.decodeString.map { x =>
DateTime.parse(x, dateTimeFormat)
}.apply(c)
}
现在如果我输入与dateTimeFormat 匹配的日期时间字符串,则解码将起作用,但如果我在dateTimeFormatWithMillis 中传递日期时间,它将无法处理。
我知道我可以使用DateTimeFormatterBuilder 添加多个解析器并对其进行处理,但是,我想知道 Circe 中是否有一种方法可以链接多个解码器以一个接一个地尝试,直到它成功或到达链的末尾?
【问题讨论】: