scala 循环,解码解码列表[SomeCaseClass]时失败

aelbi1ox  于 2023-03-08  发布在  Scala
关注(0)|答案(2)|浏览(125)

我有一个case类,其中包含另一个case类的List,如下所示:
final case class Nested(p1: String, p2: String)
final case class Outer(str: Option[String], lst: Option[List[Nested]])
我为每个类创建了EncoderDecoder(隐式变量)。
现在,当我试着这么做的时候:
val decodedEither = decode[Outer](jsonString)
我得到了这样的错误:
解码失败(类型与预期不匹配:外部,列表())
我的导入:

import io.circe.Decoder.Result
import io.circe._
import io.circe.parser._
import io.circe.syntax._
import cats.syntax.show._

这是一个普通的例子,实际的类名是不同的,我只是在一个更复杂的情况下隔离了一个错误,然后尝试了非常简单的JSON和类(几乎像上面的那些)。
有谁知道缺少了什么,以及如何让circe使用带有List(和Set)字段的case类解析JSON?

hc2pp10m

hc2pp10m1#

我不得不使用Decoder.forProductN()方法来创建解码器,而不是使用Decoder.instance()。我不知道为什么,但它解决了问题,尽管在项目中使用了这两种变体。

ijxebb2r

ijxebb2r2#

可能是您如何定义编解码器或json的问题

import io.circe.Decoder
import io.circe.generic.semiauto
import io.circe.parser.decode

final case class Nested(p1: String, p2: String)
object Nested {
  implicit val dec: Decoder[Nested] = semiauto.deriveDecoder[Nested]
}

final case class Outer(str: Option[String], lst: Option[List[Nested]])
object Outer {
  implicit val dec: Decoder[Outer] = semiauto.deriveDecoder[Outer]
}

val jsonString =
  """
    {"str":"a", "lst":[{"p1":"b", "p2":"c"}, {"p1":"d", "p2":"e"}]}
  """

decode[Outer](jsonString)
// Right(Outer(Some(a),Some(List(Nested(b,c), Nested(d,e)))))

相关问题