我无法处理使用
circe
将 FL
类的实例编码为 JSON 的情况。
我提供了两个自定义编码器 - 均用于 CS
和 RS
类。然而,在编译过程中我得到了:
could not find implicit value for parameter encoder: io.circe.Encoder[FL]
当我尝试编译时:
import io.circe.{Encoder, Json}
import io.circe.generic.extras.auto._
import io.circe.syntax._
FL(List.empty).asJson
implicit val rsEncoder: Encoder[RS] = Encoder.instance[RS] { x =>
Json.obj(
)
}
implicit val csEncoder: Encoder[CS] = Encoder.instance[CS] { x =>
Json.obj(
)
}
sealed trait A {
def s: Int
}
object A {
case class RS(s: Int, d: Double) extends A
case class CS(s: Int, l: Double) extends A
}
case class FSI[T <: A](sts: T)
final case class E(
segs: Seq[FSI[_ <: A]] = Seq.empty,
)
final case class FL(es: List[List[E]])
我看到的唯一方法是在
FL
类级别尝试实现编码器 - 但是我想避免它,因为此类包含更多元素(但是它们在编码方面没有问题)。
你能帮我做/解决它吗?或者也许存在理论上的原因这是不可能的。
我研究了你的代码,我认为有两件事让 Circe 感到困惑:
A
的子类型Seq[_ <: A]
进行编码(至少不能自动编码),所以你需要直接编码 Seq[A]
以下内容似乎按预期工作:
import io.circe.{Encoder, Json}
import io.circe.generic.extras.auto._
import io.circe.syntax._
import io.circe.generic.extras.Configuration
implicit val genDevConfig: Configuration =
Configuration.default.withDiscriminator("type")
sealed trait A {
def s: Int
}
object A {
case class RS(s: Int, d: Double) extends A
case class CS(s: Int, l: Double) extends A
}
case class FSI[T <: A](sts: T)
final case class E(
segs: Seq[FSI[A]] = Seq.empty,
)
final case class FL(es: List[List[E]])
FL(List.empty).asJson.noSpaces
FL(List(List(E(List(FSI(A.RS(1, 4.2))))))).asJson.noSpaces
您可以在 Scastie 上使用此代码。