2016-07-12 6 views
3

私はSCALAを初めて利用しています。APIPLAYSLICKで開発する予定です。Scalaでjsonフォーマットのフォームから配列を取得するには?

私は次のようになどのWebリクエストを経由してフォームから配列(JSON形式のすべての値が整数である)フェッチつもりです: -

リクエストデータ:

{"ids": [1,2,3,4,5,6,7,8,9]}  

今、私は希望をフォームの配列データを取得します。したがって、私のコントローラにフォームを宣言しました: -

case class IdsForm(ids: Array[Int]) 

private val idsForm: Form[IdsForm] = Form(
    mapping(
    "ids" -> ???? 
)(IdsForm.apply)(IdsForm.unapply) 
) 

今、その配列のすべての要素を印刷しますか?したがって、次のように関数を宣言: -

def getIds() = Action.async(parse.json) { 
    implicit request => idsForm.bind(request.body).fold(
    formWithErrors => Future.successful(BadRequest(formWithErrors.toString)), 
    form => { 
     val ids = form.ids 
     // Print all the array elements 
     for (x <- ids) { 
     println(x) 
     } 
     val responseBody = Json.obj(
      "status" -> 200, 
      "message" -> Json.toJson("Successfully printed") 
     ) 
     Ok(responseBody) 
    } 
) 
} 

私のコードに"ids" -> ????の代わりに置くために何を、私に知らせてください。単一の番号の場合は私は"id" -> numberを出しました。私はあなたがそれを行う方法の例を持っているHere ...あなたはJSONを提出するフォームを使用してはならないものを置く代わりに"ids" -> ????

答えて

2

: -

case class IdsForm(ids: Seq[Int]) 

private val idsForm: Form[IdsForm] = Form(
    mapping(
    "ids" -> seq[number] 
)(IdsForm.apply)(IdsForm.unapply) 
) 

機能は次のとおりです。 -

def getIds() = Action.async(parse.json) { 
    implicit request => idsForm.bind(request.body).fold(
     formWithErrors => Future.successful(BadRequest(formWithErrors.toString)), 
     form => { 
      val ids = form.ids 
      // Print all the array elements 
      for (x <- 0 to ids.length - 1) { 
      println(ids(x)) 
      } 
      val responseBody = Json.obj(
       "status" -> 200, 
       "message" -> Json.toJson("Successfully printed") 
      ) 
      Ok(responseBody) 
     } 
    ) 
} 

正常に動作します。大丈夫ですか?

3

????知りません。ただし、必要に応じてJSONファイルをアップロードできますか?

たとえば、あなたのデータクラスを(私はこれをテストしていない):

case class MyData(ids: List[Int]) 
object MyData { implicit val myDataJsonFormat: Json.format[MyData] } 

お使いのコントローラのルート:私のように自分のコードを使用し

def uploadJson = Action(parse.json) { request => 
    val dataResult = request.body.validate[MyData] 
    dataResult.fold(
    errors => { BadRequest(........) }, 
    data => { 
     // do whatever with data.... 
     Ok(....) 
    } 
) 
} 
+0

あなたは 'Action(parse.json [MyData])'を実行でき、playは自動的にjsonを検証することに注意してください。そのような方法では、(解析エラーがデフォルトのエラーページに渡され、htmlとしてレンダリングされる)レスポンスに対するコントロールが少なくなります。これは 'BodyParser'の' validate'メソッドを使って独自のバージョンの 'parse.json'を作ることで緩和できます(詳細はhttps://www.playframework.com/documentation/2.5.x/api/scala/indexです)。 .html#play.api.mvc.BodyParser @ validate [B](f:A =%3E [play.api.mvc.Result、B])(implicitec:scala.concurrent.ExecutionContext):play.api.mvc。 BodyParser [B]) – handler

関連する問題