使用嵌套子类喷涂json trait formatter

时间:2017-11-13 14:24:55

标签: json scala spray-json

我的用例如下:

import spray.json._
import DefaultJsonProtocol._

sealed trait TestT
case class A(a: String) extends TestT
case class B(b: String) extends TestT
case class C(c: TestT) extends TestT

case class Parent(list: Seq[TestT])


implicit val aFormat = jsonFormat1(A)
implicit val bFormat = jsonFormat1(B)

implicit lazy val cFormat = lazyFormat(jsonFormat1(C))


implicit object TestTJsonFormat extends RootJsonFormat[TestT] {
  override def read(json: JsValue) = {
    if(json.asJsObject.fields.get("a").isDefined) {
      json.convertTo[A]
    } else if(json.asJsObject.fields.get("b").isDefined) {
      json.convertTo[B]
    } else if(json.asJsObject.fields.get("c").isDefined) {
      json.convertTo[C]
    } else {
      ???
    }
  }

  override def write(obj: TestT) = {
    obj match {
      case a:A => a.toJson
      case b:B => b.toJson
      case c:C => c.toJson
      case _ => ???
    }
  }
}

implicit val pFormat = jsonFormat1(Parent)

val json = Parent(Seq(A("test"), B("test2"), A("test3"))).toJson
println(json)
val p = json.convertTo[Parent]
println(p)

主要问题是,如果我没有TestT的格式化程序,我就无法为C创建格式化程序。但我不能为TestT制作格式化程序,因为我还没有用于C的json.convertTo ...

任何想法如何解决这种形式的依赖?

1 个答案:

答案 0 :(得分:0)

https://github.com/milessabin/spray-json-shapeless

序列化整个classtrees。

False