Невозможно десериализовать объект с помощью пользовательского декодера LocalDateTime в библиотеке json круга Scala. - PullRequest
0 голосов
/ 16 октября 2018

Я пытался добавить настраиваемый десериализатор в класс дел для объекта LocalDateTime, однако он выбирает десериализатор по умолчанию из модуля circe-java8.Если вы удалите этот модуль, код не будет скомпилирован (не может найти десериализатор для LocalDateTime)

sbt

"io.circe" %% "circe-core" % circeVersion,
"io.circe" %% "circe-generic" % circeVersion,
"io.circe" %% "circe-parser" % circeVersion,
"io.circe" %% "circe-optics" % circeVersion,
"io.circe" %% "circe-java8" % circeVersion,

и исходного кода с пользовательским LocalDateTime сериализатором / десериализатором

case class A(
  date: LocalDateTime,
)

object A {
  val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
  implicit val dateEncoder = Encoder.encodeString.contramap[LocalDateTime](_.format(formatter))
  implicit val dateDecoder = Decoder.decodeString.emap[LocalDateTime](str => {
    Either.catchNonFatal(LocalDateTime.parse(str, formatter)).leftMap(_.getMessage)
  })
}

Как применить пользовательский десериализатор для LocalDateTime объекта, указанного в объекте A, к A классу дела?

1 Ответ

0 голосов
/ 16 октября 2018

Использование полуавтоматического деривации для A:

import io.circe.generic.semiauto._

case class A(
  date: LocalDateTime,
)

object A {
  val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
  implicit val dateEncoder = Encoder.encodeString.contramap[LocalDateTime](_.format(formatter))
  implicit val dateDecoder = Decoder.decodeString.emap[LocalDateTime](str => {
    Either.catchNonFatal(LocalDateTime.parse(str, formatter)).leftMap(_.getMessage)
  })
  implicit val AEncoder = deriveEncoder[A]
  implicit val ADecoder = deriveDecoder[A]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...