2016-07-12 2 views
3

Я новичок в SCALA, где я собираюсь разработать API с PLAY и SLICK.Как получить массив из форматированной формы json в Scala?

Я собираюсь принести массив (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. Я не знаю, что поставить вместо ???? в "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 ... Here у вас есть пример того, как сделать это. Хотя вы можете загрузить файл 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])», и игра автоматически проверяет json. вы получаете меньше контроля над этим ответом, хотя (ошибки синтаксического анализа передаются на страницу ошибок по умолчанию и отображаются как html). это можно смягчить, создав собственную версию 'parse.json', используя метод' validate' из 'BodyParser' (подробнее: https://www.playframework.com/documentation/2.5.x/api/scala/index .html # @ play.api.mvc.BodyParser проверить [В] (е: А =% 3EEither [play.api.mvc.Result, В]) (implicitec: scala.concurrent.ExecutionContext): play.api.mvc. BodyParser [B]) – handler

Смежные вопросы