【问题标题】:value read is not a member of play.api.libs.json.JsValue读取的值不是 play.api.libs.json.JsValue 的成员
【发布时间】:2015-01-20 05:15:04
【问题描述】:

收到此错误时正在关注 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]

  }

没有读取方法也可以正常工作

【问题讨论】:

    标签: scala playframework playframework-2.0 playframework-json


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您使用组合器创建Reads[A],则只需使用read[A]。你要找的方法是as[A]

      【讨论】:

        猜你喜欢
        • 2017-04-18
        • 1970-01-01
        • 2014-12-26
        • 2017-11-19
        • 2020-07-17
        • 2017-01-05
        • 2013-10-17
        • 2016-02-15
        • 1970-01-01
        相关资源
        最近更新 更多