当涉及到Scala时,我是一个新手,现在我正在努力学习Scala。我有一个数据库,它的设置与Slick教程中的非常相似,并使用以下命令进行查询
val users:TableQuery[user] = TableQuery[user]
如何将用户的-value从Play框架输出到JSON?我尝试为user定义case类,并为userFormat = Json.formatuser创建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)
}
发布于 2015-11-16 15:04:22
首先,请在你的问题中添加一些上下文,因为很难看出什么是不起作用的(例如,你得到编译错误了吗?你有例外吗?)。
关于问题内容,您应该将从slick获取数据并将其转换为JSON看作是两个完全独立的步骤;事实上,slick中没有任何内容可以帮助您将JSON从case类中提取出来。
考虑到这一点,你将需要运行你的巧妙查询,并从中获取你的类型的case class
实例,例如,你应该获得一个Seq[user]
。要将其转换为JSON,您应该调用Json.toJson(myUserSeq)
。根据我在你的代码中看到的,有一件事可能会妨碍你:为了让Format
在作用域中正确,你应该把它放在你的case类的伴生对象中,例如:
case class User(...)
object User {
implicit object format extends Format[User] { ... }
}
作为副业,如果你想让人们帮助你和你的代码具有可读性,请注意语言的coding standards (例如,在你的代码中使用小写的类名会让你很难理解)。
https://stackoverflow.com/questions/33735878
复制