gpt4 book ai didi

Json-circe 无法为密封特性的子类型派生编码器

转载 作者:行者123 更新时间:2023-12-04 16:03:37 24 4
gpt4 key购买 nike

为什么我得到错误 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) 编译,但是 Foo1Foo 的子类型,我不想写Foo1Foo2 的重复编码器。如何解决这个问题?

最佳答案

尝试定义实例 Decoder[Foo.Foo1]Decoder[Foo.Foo2](提取通用公共(public)部分以避免代码重复)并派生 Decoder [Foo] 使用它们。

  def helper[T <: Foo : DerivedDecoder](s: String): Decoder[T] = new Decoder[T] {
final def apply(c: HCursor): Decoder.Result[T] = {
def decode(messageType: String, payload: Json): Decoder.Result[T] = messageType match {
case _ if messageType == s => payload.as[T](deriveDecoder[T])
}

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 foo1Decoder: Decoder[Foo.Foo1] = helper[Foo.Foo1]("Foo1")
implicit lazy val foo2Decoder: Decoder[Foo.Foo2] = helper[Foo.Foo2]("Foo2")
implicit lazy val fooDecoder: Decoder[Foo] = deriveDecoder[Foo]
implicit lazy val barDecoder: Decoder[Bar] = deriveDecoder[Bar]

关于Json-circe 无法为密封特性的子类型派生编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49758486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com