我是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)
}
答案 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,如果您希望人们帮助您并且您的代码可读(例如,在您的代码中使用小写的类名,则很难遵循)。