我想为控制器提供一个select方法,该方法将表名作为参数,并将SELECT查询的结果作为JSON返回。到目前为止,我已经这样做了:
def specialSelect(tableName: String) = Action.async {
val tq: TableQuery[_] = tableObjectFactory(tableName)
val res: Future[Seq[_]] = db.run(tq.result)
res.map { p:Seq[_] => Ok(p.toJson) }
}
其中tableObjectFactory
获取我的表名并返回特定类型的TableQuery
:
def tableObjectFactory(tableName: String): TableQuery[_] = {
tableName match {
case "users" => TableQuery[Users]
case "projects" => TableQuery[Projects]
}
}
如果失败,因为没有为通用Seq[_]
定义JSON序列化程序(实际上_
应该是Product with Serializable
,不确定是否有帮助。)
表名是事先不知道的(在网址中找到,例如在"/special_select/<tableName>"
中),我有120个这样的表,所以我不能为每个表实现它。
有没有办法序列化任何 Seq[_]
,知道_
总是一个Slick行结果(例如案例类UsersRow
),无论如何表是?
我已经阅读了有关通用DAO和ActiveSlick的内容,但我不确定是否应该这么做。
答案 0 :(得分:0)
Gson工作,谢谢@pamu。添加
libraryDependencies += "com.google.code.gson" % "gson" % "2.8.0"
到build.sbt,然后这会将任何Seq[_]
或行转换为可以作为http响应给出的JsArray:
import com.google.gson.Gson
import play.api.libs.json._
val gson: Gson = new Gson()
def slickToJson(res: Seq[_]): JsArray = {
JsArray(res.map(gson.toJson).map(Json.parse))
}
// in controller Action.async:
db.run(...).map(p => Ok(slickToJson(p)))
行由Gson序列化为String,然后通过Play api解析回JsObjects,然后放入JsArray。我找不到更好的。