[环绕编码放置::当未密封来自特征的案例类列表时

问题描述 投票:0回答:1

大家好,我遇到的circe库存在问题,无法在json和scala case类之间进行翻译,任何帮助将不胜感激。

过去我有这样的ADT。

sealed trait Sons

case class Son1(name: String, belongings: List[String]) extends Sons
case class Son2(lastName: String, belongings: List[String]) extends Sons

并且没有任何问题,但由于设计的原因,现在更改此特性的文件成本很高,我们必须从特性中删除密封,因此现在我们有了(儿子在不同的文件/库中)] >

trait Sons

case class Son1(name: String, belongings: List[String]) extends Sons
case class Son2(lastName: String, belongings: List[String]) extends Sons

[在尝试将儿子的列表从Scala转换为json时,库在列表产生问题之前将::放在这个例子中可以看到。

object Test extends App{


implicit val encoderSon1: Encoder[Son1]=deriveEncoder[Son1]
  implicit val decoderSon1: Decoder[Son1]=deriveDecoder[Son1]
  implicit val encoderSon2: Encoder[Son2]=deriveEncoder[Son2]
  implicit val decoderSon2: Decoder[Son2]=deriveDecoder[Son2]

  implicit val encoderSon: Encoder[Sons] = Encoder.instance {
    case son1: Son1 => son1.asJson
    case son2: Son2 => son2.asJson
  }

  implicit val DecoderSon: Decoder[Sons] =
    List[Decoder[Sons]](
      Decoder[Son1].widen,
      Decoder[Son2].widen
    ).reduceLeft(_ or _)

  implicit val encoderSonList: Encoder[List[Sons]] = deriveEncoder
  implicit val DecoderSonList: Decoder[List[Sons]] = deriveDecoder

  val sonsList: List[Sons] = List(Son1("James",List()),Son2("Mike",List()))
  println(s"1->${sonsList}")
  println(s"2->${sonsList.asJson.noSpaces}")
  val andBack=decode[List[Sons]](sonsList.asJson.noSpaces).fold(fa=>fa.getMessage,fb=>fb.toString())
  println(s"3->${andBack}")
}

这些照片是printint

1->List(Son1(James,List()), Son2(Mike,List()))
2->{"::":[{"name":"James","belongings":[]},{"lastName":"Mike","belongings":[]}]}
3->Attempt to decode value on failed cursor: DownField(head),DownField(::)

问题是我当然不希望将列表转换为JSON时放在::字段中。

感谢您的帮助:D

[大家好,我在circe库之间遇到了在json和scala case类之间进行转换的问题,我们将不胜感激。过去我有这样的ADT。密封特征...

json scala encoding scala-cats circe
1个回答
0
投票

[对于List请勿使用半自动-半自动使用的机制与其他派生方式略有不同,例如避免出现类似问题:

© www.soinside.com 2019 - 2024. All rights reserved.