使用Circe编码具有预填充字段的所有子类型

时间:2019-09-10 20:27:21

标签: json scala encoding circe

当它们以JSON格式编码时,我希望能够向某些案例类添加字段。

例如

trait OntologyType {
  val ontologyType: String = this.getClass.getSimpleName
}
case class Thing(i: Int) extends OntologyType

val thing = Thing(23)

println(t.toJson) // 1

case class Thingy(s: Srtring, i: Int) extends OntologyType
val thingy = Thingy("Hi there", 23)

println(t.toJson) // 2

我想找到一种方法使以上内容返回

{ "i": 23, "type": "Thing" } // 1
{ "s": "Hi there", "i": 23, "type": "Thingy" } // 2

与我最接近的是使所有OntologyType都呈现其类型,但也需要以某种方式混合标准案例类编码:

implicit def encodeUser[T <: OntologyType]: Encoder[T] =
      Encoder.forProduct1("type")(u => (u.ontologyType))

1 个答案:

答案 0 :(得分:1)

尝试

implicit def encodeUser[T <: OntologyType](implicit enc: DerivedObjectEncoder[T]): Encoder[T] =
  u => enc.encodeObject(u).add("type", u.ontologyType.asJson).asJson

进口:

import io.circe._
import io.circe.generic.encoding.DerivedObjectEncoder
import io.circe.syntax._