Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 序列化继承案例类_Scala_Inheritance_Spray_Spray Json - Fatal编程技术网

Scala 序列化继承案例类

Scala 序列化继承案例类,scala,inheritance,spray,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

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

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
我的协议如下:

object GeoJsonProtocol extends DefaultJsonProtocol {
  implicit val geometryObjectsTypeFormat = GeometryObjectsTypeFormat
  implicit val polygonFormat = jsonFormat2(Polygon)
  implicit val pointFormat = jsonFormat2(Point)
}
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}")
  }
}
获取错误-找不到GeometryObject类型的证据参数的隐式值


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

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

object GeoJsonProtocol extends DefaultJsonProtocol {
  implicit val geometryObjectsTypeFormat = GeometryObjectsTypeFormat
  implicit val polygonFormat = jsonFormat2(Polygon)
  implicit val pointFormat = jsonFormat2(Point)
}
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}")
  }
}

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

在哪里定义GeometryObjectsTypeFormat?去掉这一行
隐式val geometryObjectsTypeFormat=geometryObjectsTypeFormat
应该可以解决这个问题。在我的协议中,存在层次结构。格式在叶节点处定义。不幸的是,在这种情况下这是可能的case@AndreasNeumannGeometryObjectsTypeFormat是一种在类型字段中处理各种类型的格式。还有一个层次结构。请勿与GeometryObjectsTypeFormat和GeometryObjectsFormat混淆