【问题标题】:Play: How to modify data while deserializing Json玩:如何在反序列化Json的同时修改数据
【发布时间】:2014-01-08 00:49:04
【问题描述】:

下面是一个保存用户信息的简单案例类:

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class User(
  val username: String,
  val password: String
)

...这里是提供序列化/反序列化 User 对象到/从 JSON 的功能的伴随对象:

object User {

  implicit val userWrites: Writes[User] = (
    (__ \ 'username).write[String] ~
    (__ \ 'password).write[String]
  )(unlift(User.unapply))

  implict val userReads: Reads[User] = (
    (__ \ 'username).read[String] ~
    (__ \ 'password).read[String] // how do I invoke the password hasher here?
  )(User.apply(_, _))
}

假设User 对象应始终包含散列密码,但传入的 JSON 始终提供纯文本...如何增强我的 Reads 以便它在反序列化时调用密码散列器?

【问题讨论】:

  • 我希望那些明文密码不是来自某个持久性存储!
  • 哦不 ;-) 这只是一个非常非常简单的例子来解释我在寻找什么。

标签: json scala playframework


【解决方案1】:

您可以在Reads 上使用map 方法:

def doSomething(s: String) = s * 3

case class User(val username: String, val password: String)

object User {
  implicit val userWrites: Writes[User] = (
    (__ \ 'username).write[String] ~
    (__ \ 'password).write[String]
  )(unlift(User.unapply))

  implicit val userReads: Reads[User] = (
    (__ \ 'username).read[String] ~
    (__ \ 'password).read[String].map(doSomething)
  )(User.apply(_, _))
}

然后:

scala> Json.parse("""{"username": "foo", "password": "bar"}""").as[User]
res0: User = User(foo,barbarbar)

但请注意,这意味着您的 ReadsWrites 不再是彼此的倒数。

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多