【发布时间】:2017-01-12 05:57:06
【问题描述】:
在 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)))
}
道:
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 JSON 框架,对吗?当您说“序列化 SomeClass”时,您的意思是序列化为 JSON,对吗?这种转换需要在哪里进行?在播放控制器中?你能发布控制器代码吗?
-
@virsox,添加了一些信息,不明白什么是 Play JSON 框架我使用的是 Play 2.5,它包含 Json,其他问题的答案是“是”。
-
你不应该尝试“解析”
Future[T],而是解析T“内部”Future
标签: json scala playframework future