包含参数化类类型实例的编码类

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

我无法处理使用

circe
FL
类的实例编码为 JSON 的情况。 我提供了两个自定义编码器 - 均用于
CS
RS
类。然而,在编译过程中我得到了:

could not find implicit value for parameter encoder: io.circe.Encoder[FL]

当我尝试编译时:

import io.circe.{Encoder, Json}
import io.circe.generic.extras.auto._
import io.circe.syntax._
FL(List.empty).asJson

    
implicit val rsEncoder: Encoder[RS] = Encoder.instance[RS] { x =>
    Json.obj(
    )
}

implicit val csEncoder: Encoder[CS] = Encoder.instance[CS] { x =>
    Json.obj(
    )
}


sealed trait A {
    def s: Int
}

object A {
    case class RS(s: Int, d: Double) extends A
    case class CS(s: Int, l: Double) extends A
}

case class FSI[T <: A](sts: T)

final case class E(
    segs: Seq[FSI[_ <: A]] = Seq.empty,
)

final case class FL(es: List[List[E]])

我看到的唯一方法是在

FL
类级别尝试实现编码器 - 但是我想避免它,因为此类包含更多元素(但是它们在编码方面没有问题)。 你能帮我做/解决它吗?或者也许存在理论上的原因这是不可能的。

json scala templates encoding circe
1个回答
0
投票

我研究了你的代码,我认为有两件事让 Circe 感到困惑:

  1. 要使其工作,看起来您需要添加一个指定鉴别器的配置(这是有道理的,因为仅从结构来看,不可能返回到您正在编码的
    A
    的子类型
  2. 看起来不可能对
    Seq[_ <: A]
    进行编码(至少不能自动编码),所以你需要直接编码
    Seq[A]

以下内容似乎按预期工作:

import io.circe.{Encoder, Json}
import io.circe.generic.extras.auto._
import io.circe.syntax._
import io.circe.generic.extras.Configuration

implicit val genDevConfig: Configuration =
  Configuration.default.withDiscriminator("type")

sealed trait A {
    def s: Int
}

object A {
    case class RS(s: Int, d: Double) extends A
    case class CS(s: Int, l: Double) extends A
}

case class FSI[T <: A](sts: T)

final case class E(
    segs: Seq[FSI[A]] = Seq.empty,
)

final case class FL(es: List[List[E]])

FL(List.empty).asJson.noSpaces
FL(List(List(E(List(FSI(A.RS(1, 4.2))))))).asJson.noSpaces

您可以在 Scastie 上使用此代码

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