2014-10-06 103 views
1

能有人幫我解決下面的代碼:Json的驗證與PlayFramework在斯卡拉

case class Person(name:String,email:Option[String]) 
    implicit val personFormat:Format[Person] = (
     (__ \ "name").format[String] ~ 
     (__ \ "email").formatNullable[String](email) // The code doesn't compile here 
    )(Person.apply,unlift(Person.unapply)) 

顯然FormatNullable不ReadConstraints工作,我怎麼能解決這個問題?

回答

0

emailRead[String],而這裏您需要Format[String]FormatReadWrite的組合,對於它們是對稱的情況。這裏不是這種情況,因爲驗證僅用於閱讀JSON,而不用於編寫它。所以你不能寫一個Format

爲了解決這個問題,寫你的ReadWrite分開:

implicit val personReads: Reads[Person] = (
    (JsPath \ "name").read[String] ~ 
    (JsPath \ "email").readNullable[String](email) 
)(Person.apply _) 

implicit val personWrites: Writes[Person] = (
    (JsPath \ "name").write[String] ~ 
    (JsPath \ "email").writeNullable[String] 
)(unlift(Person.unapply)) 

implicit val personFormat: Format[Person] = 
    Format(personReads,personWrites) 
+0

感謝馬丁,其實我注意到, 當我改變formatNullable [字符串](電子郵件)格式化[字符串](電子郵件),它作品。它只在使用formatNullable時停止工作。 – 2014-10-06 12:13:59

+0

好的,那種文件與文檔相矛盾。 :D我相信他們可能爲了方便而添加了'格式'的可能性,但忘記將它添加到'formatNullable'中。但這只是一個瘋狂的猜測。 – 2014-10-06 12:19:54

+0

我也覺得一樣,我會接受答案。謝謝 – 2014-10-08 09:16:25