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]のメソッドです。@drexin が述べたように、おそらく を探しているでしょうが、安全な操作ではありません。1 つでも失敗すると例外がスローされ、コントローラー ロジックでは内部サーバー エラーが発生し、ユーザーに役立つ情報はほとんどありません。JsPathReads[A]Readsas[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 に答える