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 -
我相信,我嘗試過這種方法,以及,我會重新測試並報告我的發現。 –