5

JSON リクエストを使用して、クライアントからサーバーにデータを送信しようとしています。JSON リクエストの本文は次のようになります。

{
"upload":
    {
    "ok":"some message",
    "assemblyId":"a9d8f72q3hrq982hf98q3"
    }
}

Play はリクエスト本文を JSON として認識できますが、個々の値、つまり「アップロード」オブジェクトを解析しようとすると、Play は指定されたパラメーターが見つからないと文句を言います。

Scala メソッドは次のとおりです。

def add(course:Long) = withAccount { account => implicit request =>
  println()
  println(request.body)  // output: AnyContentAsJson({"upload":{"ok":"ASSEMBLY_COMP...

  request.body.asJson.map { json =>
    println()
    println(json)  // output: {"upload":{"ok":"ASSEMBLY_COMPLETED","assemb...

    (json \ "upload").asOpt[models.SomeClass].map { upload =>
      Ok("Got upload")
    }.getOrElse {
      BadRequest("Missing parameter [upload]")
    }
  }.getOrElse {
    BadRequest("Expecting Json data")
  }
}

上記のコードが失敗する理由を理解できません。このメソッドは、リクエスト ボディを json オブジェクトにマッピングするのに問題はありません。「println(json)」コマンドは、Chrome が「リクエスト ペイロード」として表示するものとまったく同じものを出力します。しかし、ルート オブジェクト「アップロード」を取得しようとすると、失敗します。そして、このメソッドは、パラメーターの欠落について不平を言う悪い要求を返します。

4

2 に答える 2

4

asOpt[models.SomeClass] を実行するにはReads、それが機能するためのインスタンスが必要です。

ここに例があります

case class SomeClass(ok: String, assemblyId: String)
implicit object SomeClassReads extends Reads[SomeClass] {
  def reads(json: JsValue) = 
    SomeClass((json \ "ok").as[String], (json \ "assemblyId").as[String])
}

https://github.com/playframework/Play20/blob/2.0.x/framework/src/play/src/main/scala/play/api/libs/json/Readsで Reads インスタンスを実装する方法を確認できます 。 .scala#L35

于 2012-11-17T01:43:54.737 に答える
1

play 2.1xを使用している場合、Readsは2.0xから少し変更されており、おそらくそれがあなたの主な問題です(私のように)。

あなたはここで非常に良い説明を見つけることができます。

単にこのコードはうまく機能します:

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class Person(name: String, age: Int, lovesChocolate: Boolean)

implicit val personReads = Json.reads[Person]

すごいですね。ただし、注意が必要な点がいくつかあります。

  • 暗黙の定義はコントローラーにある必要があります。もちろん、それを行うには他の方法がいくつかあります。

  • モデルがmodelsクラスにある場合(上記の例ではコントローラーにあります)、オブジェクトにクラスと同じ名前を付けないでください。その場合は機能しません:

    case class Person(name: String, age: Int, lovesChocolate: Boolean)    
    
    object Person{....}  //this won't work
    

この方法には大きな利点があります。このブログをチェックすることを強くお勧めします。

于 2012-12-18T17:55:23.333 に答える