2015-09-22 24 views
1

我有下面的類結構,包括繼承噴霧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 

我的協議如下所示:

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

得到一個錯誤 - 無法找到證據參數內含價值類型GeometryObject。

有沒有辦法如何處理,並保持繼承的靈活性?

+0

你在哪裏定義GeometryObjectsTypeFormat?擺脫這一行'隱式val geometryObjectsTypeFormat = GeometryObjectsTypeFormat'應該可以解決這個問題。 –

+0

在我的協議中,有層次結構。格式在葉節點處定義。在這種情況下,這是不幸的可能 – jaksky

+0

@AndreasNeumann GeometryObjectsTypeFormat是一種處理類型字段中的各種類型的格式。還有一個層次結構。不要混淆GeometryObjectsTypeFormat和GeometryObjectsFormat – jaksky

回答

1

有必要對類層次結構父格式如下:

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}") 
    } 
} 

注:我有單獨的類層次結構,表示這是連載於型字段,它是強制性的類型,以便使類層次的序列化工作。