json - 使用 Play JSON 的多个写入来呈现对象的不同 View

标签 json scala playframework playframework-2.3

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

我想要做的是定义任意数量的额外写入,我可以使用它们像 json“ View ”一样将特定的转换或模型子集发送给客户端。在 Rails 中,我为此使用 JBuilder。

试图将不同的写入显式传递给 toJson没有给我预期的行为。采取这个简单的 Controller 操作,它应该编写一个包含所有用户 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“ View ”的首选方法?

最佳答案

当通过 Writes明确地,类型必须匹配。在这种情况下,您可以使用 Writes.list :

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

关于json - 使用 Play JSON 的多个写入来呈现对象的不同 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27052818/

相关文章:

scala - 为什么Future的恢复未捕获异常?

java - 如何在 Play 2.0 中渲染纯 html

android - 如何从 JSON 字符串中删除括号和引号

python - 递归 python-JSON 读取器

javascript - 将 Angular2 TypeScript 文件和 JavaScript 文件分离到不同的文件夹中,可能是“dist”

Scala akka-http WebSocket : How to save the client connection and push message to the client when needed?

java - 骡子 ESB : Expression Filter with regex() function

Scala 懒惰 val : a good way to go easy on the garbage collector?

performance - Scala集合转换性能: single looping vs.多重循环

scala - Play Framework : Modules were resolved with conflicting cross-version suffixes