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。我找不到更好的了。