我正在尝试读取可能具有来自客户端的以下参数的JSON

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


facebookToken可以为Null或不存在,在这种情况下,应填写电子邮件/密码,反之亦然。

我在构造此Reader时遇到了麻烦,这是到目前为止的内容:

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 path not found”通用错误。

最佳答案

您可以使用以下技巧:

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。

关于scala - Play Framework JSON Reader和自定义JSError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17818924/

10-13 00:08