3

我尝试在使用 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)的文档似乎也暗示了我采用的方法。

有人发现我的错误吗?

非常感谢,
乔尔

4

2 回答 2

6

错误信息告诉你问题是什么:返回类型必须是

play.api.libs.json.JsResult[models.Task]

因此,在我看来,您是Task直接返回,而不是将其包装在JsResult.

我不使用 Play,但这是编译器试图告诉你的。

那么,鉴于此,问题是什么?如果您查看 Play 2.0 文档,它会说reads返回一个T. 但是如果您查看GitHub 源代码,您会发现它已更改为JsResult[T]截至 2012 年 8 月 21 日。

因此,您使用的版本比人们书面建议的版本更新。

我不确定更新的 API 是否在线,但您可以在此处浏览 JSON 源。

于 2012-12-25T20:02:04.927 回答
1

根据这篇文章,在 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._
于 2013-03-05T21:27:45.717 回答