Scala 播放框架JSON阅读器和自定义JSON错误

Scala 播放框架JSON阅读器和自定义JSON错误,scala,playframework,playframework-2.0,playframework-2.1,Scala,Playframework,Playframework 2.0,Playframework 2.1,我试图读取一个JSON,它可能包含来自客户端的以下参数 { "email" : "foobar@gmail.com", "password" : "XXXX", "facebookToken": "XXXXXXXXXXX" } facebookToken可能为空或不存在,在这种情况下,应填写电子邮件/密码,反之亦然 我在构建这个阅读器时遇到了困难,以下是我目前的情况: val loginEmail = ( ( __ \ "email").read[String] and

我试图读取一个JSON,它可能包含来自客户端的以下参数

{
   "email" : "foobar@gmail.com",
   "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 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。

这看起来很合理。但是,在我的用例中,作为单个读卡器组合或组合读卡器的正确方式是什么呢?我刚刚更新了代码,出现了一个错误。。。这个解决方案更好吗?(我不理解你的问题)很抱歉这个模糊的问题,但我想说的是:如果FacebookToken或Email&Password解析正确,那么创建一个读卡器,用User对象返回JSSuccess。或者通过更改JSError返回一条自定义错误消息。我现在从您的解释中了解了如何更改错误,但我仍然不清楚如何在一个阅读器中构建JSSuccess案例(如果可能的话)