Scala Slick:如何将查询结果序列化到变量表

时间:2016-11-04 16:33:26

标签: json scala serialization playframework slick

我想为控制器提供一个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的内容,但我不确定是否应该这么做。

1 个答案:

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