我可以在 Play Framework 2.4 中从两个没有转换器的模型中编写 Json

Posted

技术标签:

【中文标题】我可以在 Play Framework 2.4 中从两个没有转换器的模型中编写 Json【英文标题】:Can I write Json from two model without transformers in Play Framework 2.4 【发布时间】:2015-12-16 12:10:13 【问题描述】:

我有两个model classes

case class Calendar(id: String, summary: String)
case class ACL(account: String, role: String)

我想写Json


    "id": "some id",
    "summary": "some text",
    "acl": [
        "user": "some user",
        "role": "some role"
    ]

没有 Json transformers

现在我有

val calendar = ...
val acl = ...

val calendarWrite = (
  (__ \ "_id").write[String] and
  (__ \ "summary").write[String] 
)(unlift(Calendar.unapply))

val aclWrite = (
  (__ \ "user").write[String] and
  (__ \ "role").write[String]
)(unlift(ACL.unapply))

val updateForMongo =
        __.json.update(
            (__ \ "acl" ).json.put( 
                JsArray( Seq( aclWrite.writes(acl) ))
            )
        )

calendarWrite.writes(calendar)
  .transform(updateForMongo)
  .fold(
    invalid =>
      Future.successful(0),
    valid =>
      calendarsCollection.insert(valid).map(l => l.n)
  )

是否有可能将多个对象写入写入流? 那么“一个领域”模型类呢?我可以写自定义Write,有什么解决方法吗?

【问题讨论】:

【参考方案1】:

如果您忘记了各种转换器和更常用的术语并在JsObject 源中查看,这是一个简单的问题。

++-+deepMerge 这就是你所需要的。

calendarWrite.writes(calendar) + ("acl" -> JsArray(Seq( aclWrite.writes(acl) )))

对于“一个字段”模型类:

case class NotificationSettings(notifications: Seq[Notification])

val nwrite = new Writes[NotificationSettings]
  override def writes(o: NotificationSettings): JsValue = 
    Json.obj("notifications" -> o.notifications)
  

【讨论】:

以上是关于我可以在 Play Framework 2.4 中从两个没有转换器的模型中编写 Json的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 2.4 发送邮件

Play Framework 2.4 全局对象迁移

如何在 play framework(scala) 2.4 中获取当前会话或请求对象?

在 Play Framework 2.4 中为 Scala 实现 Akka

在play framework 2.4中,如何访问ssl socket(或ssl client cert)

Play framework 2.4 表单填写不起作用