我尝试使用Scala到Json在play 2.0应用程序中序列化我的模型。这就是我的代码的样子:
package models
import play.api.libs.json._
case class Task(id: Long, label: String, date: String)
object Task {
...
implicit object TaskFormat extends Format[Task] {
def reads(json: JsValue): Task = Task(
(json \ "id").as[Long],
(json \ "label").as[String],
(json \ "date").as[String])
def writes(t: Task): JsValue = JsObject(Seq(
"id" -> JsNumber(t.id),
"label" -> JsString(t.label),
"date" -> JsString(t.date)))
}
}
不幸的是,运行应用程序时出现以下错误:
verriding method reads in trait Reads of type (json: play.api.libs.json.JsValue)play.api.libs.json.JsResult[models.Task]; method reads has incompatible type
我还没有找到解决方案。 api(http://www.playframework.org/documentation/api/2.0/scala/play/api/libs/json/package.html)的文档似乎也暗示了我采用的方法。
有人发现我的错误吗?
非常感谢,
乔尔
答案 0 :(得分:6)
错误消息告诉您问题所在:返回类型必须为
play.api.libs.json.JsResult[models.Task]
因此,我认为您直接返回Task
,而不是将其包裹在JsResult
中。
我不使用Play,但这是编译器试图告诉你的。
所以,鉴于此,问题是什么?如果您查看Play 2.0文档,则表示reads
会返回T
。但是,如果您查看the GitHub source,则会发现自2012年8月21日起更改为JsResult[T]
。
所以你使用的是比人们写过建议的版本更新的版本。
我不确定较新的API是否在线,但您可以浏览JSON源here。
答案 1 :(得分:1)
根据this帖子,在Play 2.1中实现Reads [T]的更正确方法是:
implicit val productReads: Reads[Product] = (
(__ \ "ean").read[Long] and
(__ \ "name").read[String] and
(__ \ "description").read[String]
)(Product.apply _)
不要忘记其他进口商品:
import play.api.libs.functional.syntax._
import play.api.libs.json._