2016-11-22 64 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

我相信,我尝试过这种方法,以及,我会重新测试并报告我的发现。 –