使用带有Play JSON的多个Write来呈现对象的不同视图

时间:2014-11-21 01:40:36

标签: json scala playframework playframework-2.3

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

我想要做的是定义任何数量的其他写入,我可以像json“views”一样将特定的转换或模型子集发送给客户端。在Rails中,我使用JBuilder来实现此目的。

尝试将不同的Writes显式传递给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“视图”的首选方法?

1 个答案:

答案 0 :(得分:7)

明确传递Writes时,类型必须匹配。在这种情况下,您可以使用Writes.list

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