给出一个密封的特征,以及2个子类:
criteriaNumberMatches
我尝试定义一个import spray.json._
sealed trait HasColor {
val hasColor: Boolean = true
}
sealed trait Ball {
val name: String
val age: Int
}
case class GreenBall(name: String, age: Int) extends Ball with HasColor
case class SimpleBall(name: String, age: Int) extends Ball
object GreenBall {
import spray.json.DefaultJsonProtocol._
implicit val format: RootJsonFormat[GreenBall] =
jsonFormat2(GreenBall.apply)
}
object SimpleBall {
import spray.json.DefaultJsonProtocol._
implicit val format: RootJsonFormat[SimpleBall] =
jsonFormat2(SimpleBall.apply)
}
来定义如何(de)序列化JSON - > BallFormat
,反之亦然。对于这个问题,我不关心如何实现Ball
方法。
write
此代码编译,但尝试使用它会显示运行时错误:
object Ball {
implicit object BallFormat extends RootJsonFormat[Ball] {
override def write(ball: Ball): JsValue =
???
override def read(json: JsValue): Ball = json match {
case JsObject(fields) =>
fields.get("hasColor") match {
case None => json.convertTo[SimpleBall]
case Some(_) => json.convertTo[GreenBall]
}
}
}
}
这个运行时错误的原因是什么?
答案 0 :(得分:2)
jsonformat
提供的DefaultJsonProtocol
方法不支持通过特征混合添加的字段。这意味着您必须为RootJsonFormat
课程写一个完整的GreenBall
,而不是使用jsonFormat
。
至少有一个构建在spray-json之上的库,它具有对序列化密封特征层次结构的开箱即用支持。看看spray-json-shapeless