如何从Slick查询结果中输出JSON?

时间:2015-11-16 12:52:31

标签: json scala playframework slick

我是Scala的新手,现在正在努力学习Slick。我有一个数据库设置,就像在Slick教程中一样,用

查询它
val users:TableQuery[user] = TableQuery[user]

如何从Play框架输出用户值-value到JSON?我已经尝试为用户定义case类,并为userFormat = Json.format [user]制作reader + writer但我不知道我哪里出错或什么的。我在Spray.IO上做过类似的事情,在那里看起来简单明了,但我想学习如何用Play和Slick来做这件事,我完全迷失了:(

这是我的Tables.scala:

    package assets

    import org.joda.time.DateTime
    import play.api.libs.json._
    import scala.slick.driver.MySQLDriver.simple._
    import com.github.tototoshi.slick.MySQLJodaSupport._
    import scala.slick.lifted.{ProvenShape}

    case class user
      (
      id:Int,
      textId:String,
      sessionId:String,
      stamp:DateTime
    )

    class users(tag: Tag) extends Table[(Int, String, String, DateTime)](tag, "USER") {

      implicit object userFormat extends Format[user] {

        def writes(a: user): JsValue = {
          Json.obj(
            "id" -> JsNumber(a.id),
            "textId" -> JsString(a.textId),
            "sessionId" -> JsString(a.sessionId),
            "stamp" -> JsString(a.stamp.toString())
          )
        }

        def reads(json: JsValue): user = user(
          (json \ "id").as[Int],
          (json \ "textId").as[String],
          (json \ "sessionId").as[String],
          (json \ "stamp").as[DateTime]
        )
      }

      def id: Column[Int] = column[Int]("id", O.PrimaryKey)
      def textId: Column[String] = column[String]("textId")
      def sessionId: Column[String] = column[String]("sessionId")
      def stamp: Column[DateTime] = column[DateTime]("stamp")

      def * : ProvenShape[(Int, String, String, DateTime)] = (id,textId,sessionId,stamp)
    }

1 个答案:

答案 0 :(得分:3)

首先,请为您的问题添加一些上下文,因为很难看到哪些内容无法正常工作(例如,您是否收到编译错误?您是否获得例外?)。

关于问题内容,​​您应该考虑从光滑获取数据并将其转换为JSON作为两个完全独立的步骤;事实上,没有任何东西可以帮助你从你的案例类中制作JSON。

鉴于此,您需要运行光滑的查询并为其中的类型获取case class个实例,例如:你应该得到Seq[user]。要将其转换为JSON,您应该调用Json.toJson(myUserSeq)。有一件事可能会妨碍我在代码中看到的内容:要在范围内正确Format,您应该将它放在案例类的伴随对象中,例如:

case class User(...)

object User {
  implicit object format extends Format[User] { ... }
}

作为副业,请注意语言coding standards,如果您希望人们帮助您并且您的代码可读(例如,在您的代码中使用小写的类名,则很难遵循)。