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 -
我相信,我尝试过这种方法,以及,我会重新测试并报告我的发现。 –