【问题标题】:Using multiple Writes with Play JSON to render different views of an object使用 Play JSON 的多次写入来呈现对象的不同视图
【发布时间】:2014-11-21 01:40:36
【问题描述】:

我正在编写一个 Play 2.3 应用程序,它提供由 mongodb 支持的 JSON。来自数据库的一些文档包含敏感字段。我希望能够在服务器端使用这些文档,但向客户端发送有限的 JSON 视图。 Reads/Writes 组合器的文档讨论了定义隐式读取和写入,它适用于向数据库发送数据和从数据库发送数据,但不能完全满足我的需求。

我想要做的是定义任意数量的附加写入,我可以使用它们(如 json“视图”)将特定的转换或模型子集发送给客户端。在 Rails 中,我为此使用了 JBuilder。

尝试将不同的写入显式传递给toJson 不会给我预期的行为。采取这个简单的控制器操作,它应该编写一个包含所有用户 ID 和用户名的 JSON 数组:

def listUsers = Action.async {
    val testCustomWrite: Writes[User] = (
      (__ \ "id").write[String] and
      (__ \ "username").write[String]) { user: User =>
        (user._id.toString(), user.username)
      }

    UserDao.findAll().map {
      case Nil => Ok(Json.toJson(""))
      case users => Ok(Json.toJson(users)(testCustomWrite))
    }
  }

编译失败

type mismatch;
[error]  found   : play.api.libs.json.Writes[models.User]
[error]  required: play.api.libs.json.Writes[List[models.User]]
[error]       case users => Ok(Json.toJson(users)(testCustomWrite))

toJson 处理写入对象列表的方式取决于数组的 隐式 编写器,而数组又依赖于 隐式 类型的编写器。我可以将上面的内容重写为 val testCustomWrite: Writes[List[User]] 但这感觉不是正确的解决方案,因为 Play 已经为隐式写入提供了一个数组包装器。

有在 Play2 中呈现多个 JSON“视图”的首选方法吗?

【问题讨论】:

    标签: json scala playframework playframework-2.3


    【解决方案1】:

    当显式传递Writes 时,类型必须匹配。在这种情况下你可以使用Writes.list:

    Json.toJson(users)(Writes.list(testCustomWrite))
    

    【讨论】:

    • 啊,谢谢。我对 scala 还是很陌生,所以我错过了。在您看来,为了在模型上定义 JSON“视图”是 Play2 中的最佳/标准模式,有几个不同的写入?
    • @imagio 我通常每个班级没有多次读/写,但有时这是必要的。例如,如果需要在序列化之前从其中删除一些信息,或者可能添加额外的信息。
    猜你喜欢
    • 2021-11-19
    • 2019-03-29
    • 1970-01-01
    • 2011-07-06
    • 2020-01-14
    • 1970-01-01
    • 2013-04-07
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多