json - 无法使用 Scala circle json 库中 LocalDateTime 的自定义解码器反序列化对象

标签 json scala

我试图将自定义反序列化器添加到 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)
  })
}

如何将对象 A 中指定的 LocalDateTime 对象的自定义反序列化器应用于 A 案例类?

最佳答案

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]
}

关于json - 无法使用 Scala circle json 库中 LocalDateTime 的自定义解码器反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52843673/

相关文章:

jquery - LocalStorage,循环匹配的 ID,从 DOM 中删除

json - 从 JSON 文件中删除换行符、制表符和回车符等转义序列字符

java - 如何使用 Retrofit 发布多个 JSON 数组(Android、Java)

scala - Scala Spark中的NullPointerException,似乎是集合类型引起的吗?

scala - 如何使用 Slick 1.0.1 增加 MySQL 中的列

scala - 如何在准引用宏中优化通用 Wea​​kTypeTag

javascript - 在异步读取文件的同时解析 JSON

c# - 反序列化 Json Web API 响应 - 嵌套对象

inheritance - Scala从Java类继承: select which super constructor to call

Scala:如何区分调用的函数和函数参数?