2016-03-21 4 views
0

У меня есть request.body, входящий в контроллер, и прежде чем я что-нибудь сделаю с ним, я хочу проверить, является ли это массивом. Иначе оберните его в массив и продолжайте.Проверка и преобразование типа Scala

Я пробовал это, но я недостаточно хорошо знаком с игрой scala, чтобы заставить ее работать/найти ответ.

if (request.body.isInstanceOf[Array] == false) { 
    var input = Array(request.body) 
} 
else { 
    var input = request.body 
} 

Мой контроллер

def insertMultiple = Action.async(parse.json) { 
request => 
[INSERT IF/ELSE Statement here] 
    Json.fromJson[Seq[Person]](request.body) match { 
     case JsSuccess(newPersons, _) => 
     val documents = newPersons.map(implicitly[collection.ImplicitlyDocumentProducer](_)) 

     collection.bulkInsert(ordered = true)(documents: _*).map{ 
      multiResult => 
      Created(s"Created ${multiResult.n} persons") 
     } 

     case [email protected](_) => 
     Future.successful(BadRequest("Test")) 
    } 

}

+0

Тип 'body' по умолчанию (если вы не определили анализатор тела) 'AnyContent', почему вы думаете, что это может быть« Массив »? Можете ли вы опубликовать полный метод контроллера, который вы используете? –

+0

В основном я могу добавить нескольких людей в db, но они входят как [{Person1}, {Person2}]. Однако, если запрос приходит только с {Person}, этот метод прерывается. Поэтому я решил попробовать обернуть вокруг него массив, чтобы стать [{Person}], чтобы заставить метод работать – Jeff

ответ

1

Попробуйте это:

// as long as you have an implicit Format[Person] in scope 
// List[Person] 
val people = r.body.validate[JsArray].asOpt.getOrElse { 
    Json.arr(r.body) 
}.as[List[Person]] 
+0

Это сработало! Исправьте меня, если я работаю, но вы проверяли тело как JsArray, и если бы это не возвращалось, вы превратили тело в массив с помощью Json.arr. Что делает asOpt точно? – Jeff

+0

также мне не нужен как [List [Person]] – Jeff