Я использую 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
, чтобы добавить несколько парсеров и обработать их, однако мне было интересно, есть ли способ в Цирцее объединить несколько декодеров, чтобы они пытались один за другим, пока он не достигнет успеха или не достигнетконец цепи?