Scala Slick:如何将查询结果序列化为变量 table
Scala Slick: how to serialize the result of a query to a variable table
我想向控制器提供一个 select 方法,该方法将 table 名称作为参数,returns 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
采用我的 table 名称和 returns 特定类型的 TableQuery
:
def tableObjectFactory(tableName: String): TableQuery[_] = {
tableName match {
case "users" => TableQuery[Users]
case "projects" => TableQuery[Projects]
}
}
如果失败,因为没有为通用 Seq[_]
定义 JSON 序列化程序(实际上 _
应该是 Product with Serializable
,不确定是否有帮助)。
这个table名字是事先不知道的(在URL中找到,比如在"/special_select/<tableName>"
中),我有120个这样的table所以我不能只为每个 table.
实现它
有没有办法序列化 any Seq[_]
,知道 _
总是一个 Slick 行结果(例如 class UsersRow
),无论 table 是什么?
我已经阅读了有关通用 DAO 和 ActiveSlick 的内容,但我不确定是否应该走这么远。
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。我找不到更好的了。
我想向控制器提供一个 select 方法,该方法将 table 名称作为参数,returns 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
采用我的 table 名称和 returns 特定类型的 TableQuery
:
def tableObjectFactory(tableName: String): TableQuery[_] = {
tableName match {
case "users" => TableQuery[Users]
case "projects" => TableQuery[Projects]
}
}
如果失败,因为没有为通用 Seq[_]
定义 JSON 序列化程序(实际上 _
应该是 Product with Serializable
,不确定是否有帮助)。
这个table名字是事先不知道的(在URL中找到,比如在"/special_select/<tableName>"
中),我有120个这样的table所以我不能只为每个 table.
有没有办法序列化 any Seq[_]
,知道 _
总是一个 Slick 行结果(例如 class UsersRow
),无论 table 是什么?
我已经阅读了有关通用 DAO 和 ActiveSlick 的内容,但我不确定是否应该走这么远。
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。我找不到更好的了。