2016-09-04 3 views
1

В платформе Play я использую Slick с базой данных MySQL, как я могу преобразовать результат запроса (Future [Seq [SomeClass]]) в Json для дальнейшего использования в автозаполнении jQuery. Я могу сериализовать SomeClass, но где я должен использовать .map (или что-то еще)?Как преобразовать будущее [Seq [SomeClass]] в Json?

Добавлено:

Модель:

package models 
    import play.api.libs.json._ 

    case class Equipment(id: Long, name: String,area: String,kiMin: Double,kiMax: Double,cosFiMin: Double,cosFiMax: Double){ 

    implicit val equipmentWrites = new Writes[Equipment] { 
    def writes(equipment: Equipment) = Json.obj(
    "id" -> equipment.id, 
    "name" -> equipment.name, 
    "area" -> equipment.area, 
    "kiMin" -> equipment.kiMin, 
    "kiMax" -> equipment.kiMax, 
    "cosFiMin" -> equipment.cosFiMin, 
    "cosFiMax" -> equipment.cosFiMax 
    ) 

//also tried this for Seq 

/* def writes(equipment: Equipment): JsValue = { 
    val equipmentSeq = Seq(
     "id" -> JsNumber(equipment.id), 
     "name" -> JsString(equipment.name), 
     "area" -> JsString(equipment.area), 
     "kiMin" -> JsNumber(equipment.kiMin), 
     "kiMax" -> JsNumber(equipment.kiMax), 
     "cosFiMin" -> JsNumber(equipment.cosFiMin), 
     "cosFiMax" -> JsNumber(equipment.cosFiMax) 
    ) 
    JsObject(equipmentSeq) 
    }*/ 

    } 
    } 

Контроллер:

def auto(term: String) = Action { 
    Ok(Json.toJson(equipmentDAO.get(term))) 
    } 

DAO:

def get(name: String): Future[Seq[Equipment]] = db.run((equipment.filter { _.name === name }).result) 

Added2: метод

контроллер:

def auto(term: String) = Action.async { 
    val future: Future[Seq[Equipment]] = equipmentDAO.get(term) 
    future.map { seqOfSomeClass => 
     Ok(Json.toJson(seqOfSomeClass)) 
    } 
    } 

Serializer:

implicit val equipmentWrites: Writes[Equipment] = (
    (JsPath \ "id").write[Long] and 
     (JsPath \ "name").write[String] and 
     (JsPath \ "area").write[String] and 
     (JsPath \ "kiMin").write[Double] and 
     (JsPath \ "kiMax").write[Double] and 
     (JsPath \ "cosFiMin").write[Double] and 
     (JsPath \ "cosFiMax").write[Double] 
    )(unlift(Equipment.unapply)) 
+0

Более подробная информация необходима. Вы используете Play JSON, верно? Когда вы говорите «сериализовать SomeClass», вы подразумеваете сериализацию в JSON, правильно? Где это преобразование должно быть сделано? В игровом контроллере? Не могли бы вы отправить код контроллера? – virsox

+0

@ virsox, добавил некоторую информацию, не понимаю, что такое Play JSON framework Я использую Play 2.5, он включает Json, ответ на другие вопросы - «да». –

+1

Не пытайтесь «разгадать» 'Future [T]', но parse 'T' внутри' 'Future' – cchantep

ответ

4

Учитывая, что вы понимаете, как Play Framework handles JSON и уже Reads and Writes для SomeClass, вы можете сделать что-то вроде этого в контроллере:

def someAction = Action.async { 
    val future: Future[Seq[SomeClass]] = ??? // get the future using Slick 
    future.map { seqOfSomeClass => 
    Ok(Json.toJson(seqOfSomeClass)) 
    } 
} 

Это будет serve a list of SomeClass in JSON.

+0

спасибо, я попробую завтра и скажу результат –

+0

Я отредактировал сообщение для показать, что я сделал (после «Added2:»), но я все еще получаю «Серийный анализатор Json No No для типа Seq [models.Equipment]. Попробуйте реализовать неявные записи или формат для этого типа». Где может быть проблема? –

+0

Это решение работает, мне просто нужно было поставить ** Writes ** в сопутствующий объект, спасибо. –

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