scala - Spray-json序列化继承案例类

标签 scala inheritance spray spray-json

我有以下涉及继承的类结构

sealed trait GeometryObject
case class Point(coordinates: Array[Double],`type` :GeometryObjectsType) extends GeometryObject

case class Polygon(coordinates: Array[Array[Array[Double]]],`type` :GeometryObjectsType) extends GeometryObject

我的协议(protocol)如下所示:

object GeoJsonProtocol extends DefaultJsonProtocol {
  implicit val geometryObjectsTypeFormat = GeometryObjectsTypeFormat
  implicit val polygonFormat = jsonFormat2(Polygon)
  implicit val pointFormat = jsonFormat2(Point)
}

收到错误 - 找不到 GeometryObject 类型的证据参数的隐式值。

有没有办法处理这个问题并保持继承灵活性?

最佳答案

需要类层次结构父格式如下:

object GeometryObjectLeafFormats extends DefaultJsonProtocol{
  implicit val geometryObjectsTypeFormat = GeometryObjectsTypeFormat
  implicit val polygonFormat = jsonFormat2(Polygon)
  implicit val pointFormat = jsonFormat2(Point)
}

object GeometryObjectFormat extends JsonFormat[GeometryObject] {
  import GeometryObjectLeafFormats._
  override def read(json: JsValue): GeometryObject = json match {
    case known:JsObject if known.fields.contains("type") =>
      known.fields.get("type").get match{
        case JsString(PointType.value) => pointFormat.read(known)
        case JsString(PolygonType.value) => polygonFormat.read(known)
        case unknown => deserializationError(s"unknown GeometryObject: ${unknown}")
      }
    case unknown => deserializationError(s"unknown GeometryObject: ${unknown}")
  }

  override def write(obj: GeometryObject): JsValue = obj match {
    case x:Point => pointFormat.write(x)
    case x:Polygon=> polygonFormat.write(x)
    case unrecognized => serializationError(s"Serialization problem ${unrecognized}")
  }
}

注意:我有单独的类层次结构,表示序列化为类型字段的类型,为了使类层次结构序列化正常工作,这是必需的。

关于scala - Spray-json序列化继承案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32721636/

相关文章:

Scala sbt jar 允许在命令行上传递类路径时导入,但不能在 REPL 中导入

c# - 为什么我们应该避免公共(public)方法?封装的好处

scala - 添加两个 Set[Any]

javascript - 附加到错误对象的属性

java:继承

scala - 如何使用 jsonspray 序列化具有特征的案例类

scala - 在Scala中处理嵌套的可为空对象的惯用方法?

c++ - 通过对基类的引用调用虚函数

scala - 在哪里放置用于 scala Spray 应用程序的 favicon(即站点的根目录是什么?)?

scala - 喷雾解码泛型