我无法处理使用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
类级别上尝试实现编码器-但是我想避免它,因为这个类包含更多的元素(但是它们在编码方面没有问题)。你能帮助我做/解决它吗?或者可能存在理论上的原因,这是不可能的。
1条答案
按热度按时间bqf10yzr1#
我研究了你的代码,我认为有两件事让喀耳刻感到困惑:
1.要做到这一点,看起来需要添加一个配置来指定一个
A
(这是有意义的,因为仅从结构中无法返回到您正在编码的A
的子类型1.看起来不可能对
Seq[_ <: A]
进行编码(至少不是自动的),所以你只需要使用Seq[A]
(我认为这不会限制你的实践,但很高兴纠正)以下内容似乎按预期工作:
字符串
请注意,我甚至不必包含
RS
和CS
的自定义编码器。你可以使用这段代码here on Scastie(我配置为使用Scala 2.13和Circe 0.14.3,根据你最初的帖子,它似乎是朝着你当前依赖项的方向发展的)。
如果你想使用自定义编码器,你必须通过显式地拥有一个
Encoder[A]
来手动分派到每种类型,如下面的代码片段所示:型
这个例子是also available on Scastie。请注意,在这种情况下,如果需要将这些JSON对象解析为相同的类型,仍然必须使用某种形式的JavaScript。
我用信息from the Circe documentation about ADT encoding写了这个。