如何将 Future[Seq[SomeClass]] 转换为 Json?

Анд*_*пов 1 json scala future playframework

在 Play 框架中,我将 Slick 与 MySQL 数据库一起使用,如何将查询结果(Future[Seq[SomeClass]])转换为 Json 以在 jQuery Autocomplete 中进一步使用。我可以序列化SomeClass,但是我应该在哪里使用.map(或其他东西)?

补充

模型:

   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)
  }*/

    }
    }
Run Code Online (Sandbox Code Playgroud)

控制器:

   def auto(term: String) = Action {
    Ok(Json.toJson(equipmentDAO.get(term)))
  }
Run Code Online (Sandbox Code Playgroud)

道:

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

补充2:

控制器方法:

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

序列化器:

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))
Run Code Online (Sandbox Code Playgroud)

mar*_*ira 5

考虑到您了解Play Framework如何处理 JSON并且已经有了ReadsandWrites for SomeClass,您可以在控制器中执行以下操作:

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

这将提供一个SomeClassJSON列表