0

出现此错误时正在关注 Play Frameworks 的 Scala Json api Docs:

读取的值不是 play.api.libs.json.JsValue 的成员

我的进口是:

 import play.api.libs.json._       // JSON library
 import play.api.libs.json.Reads._ //custom validation helpers
 import play.api.libs.functional.syntax._   // Combinator syntax

和方法抛出错误是:

  def callSearchRoleRowInRoleService =  Action(parse.json) { 

  implicit request =>           

  var rolejson = request.body
  val roleId = (rolejson \ "roleId").read[Int]
  val shortDescription : Reads[String]= (rolejson \ "shortDescription").read[String]
  val description = (rolejson \ "description").read[String]    
  val activationDate = (rolejson \ "activationDate").read[java.sql.Date]
  val deactivationDate = (rolejson \ "deactivationDate").read[java.sql.Date]

  }

无需读取方法即可正常工作

4

2 回答 2

2

您确实应该将数据反序列化为案例类。read[A]是一种方法JsPath,以便创建Reads[A]组合成一个更大的Reads对象。正如@drexin 提到的,您可能正在寻找as[A],但这不是一个安全的操作。如果单个as失败,它会引发异常,这在您的控制器逻辑中将导致内部服务器错误,几乎没有信息可以帮助用户。

您可以Reads为这样的案例类构建:

case class Role(id: Int, short: String, description: String, activation: java.sql.Date, deactivation: java.sql.Date)

object Role {
    implicit val reads: Reads[Role] = (
         (JsPath \ "roleId").read[Int] and 
         (JsPath \ "shortDescription").read[String] and 
         (JsPath \ "description").read[String] and 
         (JsPath \ "activationDate").read[java.sql.Date] and
         (JsPath \ "deactivationDate").read[java.sql.Date]
    )(Role.apply _)
}

然后你的控制器功能看起来更像这样:

def callSearchRoleRowInRoleService =  Action(parse.json) { implicit request =>           
    request.body.validate[Role].fold(
        errors => { // handle validation errors, return some error message? },
        role => { // do something with the `role` to product a `Result` }
    )
}

使用的好处validate是所有的验证错误都会被累积起来,因此可以一次处理它们,而不会抛出异常。

而且因为其他人肯定会提到它,对于简单的案例类(如上面的类),您可以跳过组合器并使用宏:

 implicit val reads = Json.reads[Role]
于 2014-11-22T00:16:37.810 回答
1

只有在read[A]使用组合器来创建Reads[A]. 您正在寻找的方法是as[A].

于 2014-11-22T00:04:50.970 回答