gpt4 book ai didi

scala - Circe 解码为由多个案例类扩展的密封特征

转载 作者:行者123 更新时间:2023-12-04 02:59:34 24 4
gpt4 key购买 nike

我以前见过类似的问题,但没有一个有效。我认为他们会问一些不同的问题,所以我在这里问。
我在一个文件中有这样的东西:

sealed trait Thing
case class SomeThing() extends Thing
case class OtherThing() extends Thing

并在另一个文件中:
val str = //valid json
val decoded = decode[Thing](str)
println(decoded)

我得到:
Left(DecodingFailure(...))

如果我这样做,这会起作用:
val str = //valid json
val decoded = decode[SomeThing](str)
println(decoded)

最佳答案

我必须为序列化/反序列化编写自己的编码器和解码器。

例子,

import io.circe._, io.circe.generic.auto._, io.circe.parser._, io.circe.syntax._

object CirceSubtypesSerialisers {

def main(args: Array[String]): Unit = {

sealed trait Data

case class OptionsData(data: Seq[String]) extends Data
case class TextData(data: String) extends Data

object Data {
implicit val decodeData: Decoder[Data] = Decoder[OptionsData].map[Data](identity).or(Decoder[TextData].map[Data](identity))

implicit val encodeData: Encoder[Data] = Encoder.instance {
case options @ OptionsData(_) => options.asJson
case text @ TextData(_) => text.asJson
}
}

val optionsJson ="""{ "data": ["option1", "option2"] }""".stripMargin

decode[Data](optionsJson) match {
case Right(r: OptionsData) => println(r)
case Left(l) => println(l)
}


val textJson ="""{ "data": "hey, how can i help ya?" }""".stripMargin

decode[Data](textJson) match {
case Right(r: TextData) => println(r)
case Left(l) => println(l)
}

}

}

输出:
OptionsData(List(option1, option2))
TextData(hey, how can i help ya?)

这在 https://circe.github.io/circe/codec.html#warnings-and-known-issues中也有提到和 JsonCodec for sealed traits requires an explicit object definition

关于scala - Circe 解码为由多个案例类扩展的密封特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50457466/

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