【发布时间】:2016-10-24 02:54:21
【问题描述】:
我有一个用例,我想将用户实体序列化为 json。此用户实体包括我不想公开的私有字段,例如密码。
当我返回单个用户时,我正在使用自定义 OWrites 来处理这个问题:
val userSafeWrites: OWrites[User] = (
(__ \ EMAIL_FIELD).write[String] ~
(__ \ FIRST_NAME_FIELD).write[String] ~
(__ \ LAST_NAME_FIELD).write[String] ~
(__ \ PHONE_NUMBER_FIELD).write[Option[String]] ~
(__ \ ID_FIELD).write[Long]
)(p => (p.email, p.firstName, p.lastName, p.phoneNumber, p._id.get))
然后我指定 OWrites 而不是使用隐式:
Ok(Json.toJson(user)(User.userSafeWrites))
但是,我现在必须返回 Set[User]。
我该怎么做?我需要实现OWrites[Set[User]] 吗?如果我要返回一个带有字段名称的对象以及结果,我可以理解如何做到这一点,例如:
{
"users": [{user1}, {user2}]
}
但是,我只想返回一个数组,以适应其他端点的输出:
[{user1}, {user2}]
或者我应该将集合的每个元素映射到 JsObject 并将自定义 OWrites 应用于每个对象?最有效的方法是什么?
我觉得这很简单,我只是因为自己没有找到答案而成为白痴。
【问题讨论】:
-
您必须在隐式范围内“公开”您的
OWrites[User](显式导入它,或者将它放在User的伴随对象中)。然后,Play 提供的Writes[Set[T]]将与T = User一起工作,无需执行更多操作。 -
在这种情况下,我不能将 OWrites 作为隐式,因为在隐式范围内我已经有另一个 OWrites[User]。我对这个类有两个不同的序列化要求。
-
没有什么能阻止您将 this 作为本地隐式导入(仅在一个函数的范围内,而不是整个类)。
标签: json scala playframework playframework-2.4