2016-11-22 46 views
3

我來自Java背景,其中映射POJO真的很簡單。我希望對於scala/play也是如此(對於case類),但是當我嘗試添加一些層次結構時,事情似乎確實會影響到表格。斯卡拉播放JSON映射不適用於繼承

所以,我的具體問題是,我試圖通過websocket發送各種消息,JSON對此非常好。但是,我不想在每個類的消息中重複每個類的共同屬性,因此也就是繼承。

所以,我想是這樣的:

class WSMessage(messageType:String) 
class EventMessage(eventType:String) extends WSMessage("event") 
class AlertMessage(alertType:String) extends WSMessage("alert") 

,並有可能進一步特異性....

class LoginEventMessage(login:Login) extends EventMessage("login") 
class OrderEventMessage(order:Order) extends EventMessage("order") 
class TerrainAlertMessage(terrain:Terrain) extends AlertMessage("terrain") 

現在,假設我已經把類似:

object LoginEventMessage { implicit val fmt = Json.format[LoginEventMessage] } 

AND

object Login { implicit val fmt = Json.format[Login] } 

在層次結構的每個步驟的每個對象(這真的很討厭)我仍然只獲得最低級別的屬性轉換爲JSON。

例如

Json.toJson(new LoginEventMessage(theLogin)) 

產生類似

{ "login": { "username": "foo", "timestamp": "0000000" } } 

而不是

{ "messageType": "event", "eventType": "login", "login": { "username": "foo", "timestamp": "0000000" } } 

如何做到這一點的任何指導,不重複在最低水平的所有屬性將受到歡迎!

乾杯。

編輯添加嘗試#2 我根據Zoltán的評論嘗試修改一些東西。下面是結果:

object Login { implicit val fmt = Json.format[Login] } 
case class Login(username:String, timestamp:DateTime) 

object WSMessage { implicit val fmt = Json.format[WSMessage] } 
class WSMessage(val messageType:String) 
object EventMessage { implicit val fmt = Json.format[EventMessage] } 
class EventMessage(val eventType:String) extends WSMessage("event") 
object LoginEventMessage { implicit val fmt = Json.format[LoginEventMessage] } 
class LoginEventMessage(val login:Login) extends EventMessage("login") 

我們得到編譯錯誤,因爲這些都不是case類(他們不喜歡繼承)。

[error] /app/model/dto/WSMessage.scala:15: No unapply or unapplySeq function found 
[error] object WSMessage { implicit val fmt = Json.format[WSMessage] } 
[error]            ^
[error] /app/model/dto/WSMessage.scala:17: No unapply or unapplySeq function found 
[error] object EventMessage { implicit val fmt = Json.format[EventMessage] } 
[error]             ^
[error] /app/model/dto/WSMessage.scala:19: No unapply or unapplySeq function found 
[error] object LoginEventMessage { implicit val fmt = Json.format[LoginEventMessage] } 
[error]              ^
[error] three errors found 
[error] (compile:compileIncremental) Compilation failed 
[error] application - 

回答

1

記住,聲明類時,而不是case類,構造函數的所有參數都protected領域,除非val聲明。

因此,爲了所有字段暴露在JSON格式,你需要val聲明他們:

class WSMessage(val messageType:String) 
class EventMessage(val eventType:String) extends WSMessage("event") 
class AlertMessage(val alertType:String) extends WSMessage("alert") 

class LoginEventMessage(val login:Login) extends EventMessage("login") 
class OrderEventMessage(val order:Order) extends EventMessage("order") 
class TerrainAlertMessage(val terrain:Terrain) extends AlertMessage("terrain") 
+0

我相信,我嘗試過這種方法,以及,我會重新測試並報告我的發現。 –