繁体   English   中英

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

[英]value read is not a member of play.api.libs.json.JsValue

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

读取的值不是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]

  }

无需读取方法即可完美工作

您确实应该将数据反序列化为案例类。 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]

仅在使用组合器创建Reads[A]才需要使用read[A] Reads[A] 您正在寻找的方法是as[A]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM