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

How to convert Future[Seq[SomeClass]] to Json?

在 Play 框架中,我将 Slick 与 MySQL 数据库一起使用,如何将查询结果 (Future[Seq[SomeClass]]) 转换为 Json 以便在 jQuery 自动完成中进一步使用。我可以序列化 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)
  }*/

    }
    }

控制器:

   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)

添加2:

控制器方法:

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

序列化器:

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))

考虑到您了解 Play Framework handles JSON and already have 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