2014-01-07 25 views
2

修改數據下面下面是一個簡單的例子類,用於保存用戶信息:播放:如何在以反序列化JSON

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,以便它調用passwor d hasher而反序列化?

+0

我希望那些明文密碼不是來自一些持久存儲! –

+0

哦,不;-)這只是一個非常非常簡單的例子來解釋我在找什麼。 – j3d

回答

2

您可以在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不再是彼此的逆。