当它们以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))
答案 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._