ima*_*gio 5 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))
}
}
Run Code Online (Sandbox Code Playgroud)
这无法编译
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))
Run Code Online (Sandbox Code Playgroud)
该方式toJson处理写对象的列表依赖于隐式数组作家依赖于一个隐含的类型作家.我可以重写上面的内容,val testCustomWrite: Writes[List[User]]但这不是正确的解决方案,因为Play已经为隐式写入提供了一个数组包装器.
是否有一种在Play2中呈现多个JSON"视图"的首选方法?
Writes明确传递时,类型必须匹配.在这种情况下,您可以使用Writes.list:
Json.toJson(users)(Writes.list(testCustomWrite))
Run Code Online (Sandbox Code Playgroud)