我有一个模特
package models
import scala.slick.driver.SQLServerDriver.simple._
import play.api.libs.json._
import play.api.db.DB
import play.api.Play.current
import Database.threadLocalSession
case class College(collegeCode: String, collegeName: String)
object College {
lazy val database = Database.forDataSource(DB.getDataSource())
val CollegeTable = new Table[College]("College"){
def collegeCode = column[String]("CollegeCode", O.PrimaryKey)
def collegeName = column[String]("CollegeName")
def * = collegeCode ~ collegeName <> (College.apply _, College.unapply _)
implicit val CollegeReads = Json.reads[College]
implicit val CollegeWrites = Json.writes[College]
}
def getAll: Seq[College] = {
database withSession {
val q = Query(CollegeTable)
q.list
}
}
在我的控制器中,我试图将数据呈现为JSON。
Ok(Json.toJson(College.getAll))
查看页面时收到此错误:
No Json deserializer found for type Seq[models.College]. Try to implement an implicit Writes or Format for this type.
我认为在模型中定义隐式读/写可以解决这个问题。直到我做这样的事情:
Ok(Json.toJson(College.getAll.map { c=>
(c.collegeCode, c.collegeName)
} toMap))
实际呈现JSON之前在控制器中的。我在隐式读/写实现中做错了什么?
答案 0 :(得分:4)
问题是控制器无法看到隐含。它们隐藏在块内,用于定义CollegeTable
。
您是否有任何特殊原因需要此位置的隐含?如果没有,那么你可以把暗示放在你的控制器中。
如果您希望模型旁边有含义,请将含义移到一个级别并将其导入控制器。
object College {
implicit val CollegeReads = Json.reads[College]
implicit val CollegeWrites = Json.writes[College]
}
class Controller extends Controller {
import College.CollegeReads
import College.CollegeWrites
...
}