【发布时间】:2018-09-20 08:38:06
【问题描述】:
为什么会出现错误could not find Lazy implicit value of type io.circe.generic.decoding.DerivedDecoder[A$A6.this.Bar]
在以下代码中:
import io.circe.{Decoder, DecodingFailure, Encoder, HCursor, Json, ObjectEncoder}
import io.circe.generic.semiauto._
import io.circe.generic.semiauto._
import io.circe.syntax._
import io.circe.parser._
sealed trait Foo
object Foo {
case class Foo1(foo1: String) extends Foo
case class Foo2(foo2: String) extends Foo
}
case class Bar(foo1: Foo.Foo1)
implicit lazy val FooDecoder: Decoder[Foo] = new Decoder[Foo] {
final def apply(c: HCursor): Decoder.Result[Foo] = {
def decode(messageType: String, payload: Json): Decoder.Result[Foo] = messageType match {
case "Foo1" => payload.as[Foo.Foo1](deriveDecoder[Foo.Foo1])
case "Foo2" => payload.as[Foo.Foo2](deriveDecoder[Foo.Foo2])
}
for {
messageType <- c.downField("type").as[String]
payload <- c.downField("payload").focus.toRight(DecodingFailure("payload field is not present", Nil))
in <- decode(messageType, payload)
} yield in
}
}
implicit lazy val barDecoder: Decoder[Bar] = deriveDecoder[Bar]
parse("""
|{ "foo1": {
| "type" : "Foo1",
| "payload": {
| "foo1": "bar"
| }
| }
|}
""".stripMargin)
.flatMap(json => json.as[Bar])
它使用case class Bar(foo1: Foo) 编译,但Foo1 是Foo 的子类型,我不想为Foo1 和Foo2 编写重复的编码器。如何解决这个问题?
【问题讨论】: