2013-07-23 159 views
2

我想讀一個JSON,可能有從客戶播放框架JSON Reader和定製JSErrors

{ 
    "email" : "[email protected]", 
    "password" : "XXXX", 
    "facebookToken": "XXXXXXXXXXX" 
} 

facebookToken未來下列參數可能是空或不存在,在這種情況下, 應填寫電子郵件/密碼,反之亦然。

我無法構建這個閱讀器,這是我到目前爲止有:

val loginEmail = (
    (__ \ "email").read[String] and 
    (__ \ "password").read[String] 
)((email: String, password: String) => new User(email, password)) 

val loginFacebook = (
    (__ \ "facebookToken").read[String] 
)((facebookToken : String) => new User(facebookToken)) 

val loginReader(RequestBodyJson) = (
    (RequestBodyJson).read[User](loginEmail) or 
    (RequestBodyJson).read[User](loginFacebook) 
) 

誰能告訴我如何正確地做到這一點?

我也想用它自定義消息返回JSError。例如,如果FacebookToken不存在,並且電子郵件有問題(「電子郵件無效」),而不是「/ facebookToken路徑未找到」一般錯誤。

回答

8

您可以使用此招數:

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 
import play.api.data.validation.ValidationError 

.... 
(__ \ "facebookToken").read[String].orElse(Reads(_ => JsError(ValidationError("custom-error")))) 

您可以返回自定義JsError如果主讀者失敗。

+0

這看起來很合理。但是,在我的用例中構成或組合閱讀器作爲單個閱讀器的正確方法是什麼? –

+0

我剛剛更新了代碼,出現了一個錯誤......此解決方案是否更好? (我不明白你的問題) –

+0

對不起,這是我想要的: 創建一個讀取器,如果FacebookToken或電子郵件和密碼被正確解析,返回帶有用戶對象的JSSuccess。或通過更改JSError返回自定義錯誤消息 我明白如何從您的解釋中更改錯誤,但我仍然不清楚如何在一個Reader中構建JSSuccess案例(如果可能的話) –