使用Play Scala api和Json序列化对象

时间:2012-12-25 19:55:05

标签: json scala playframework-2.0 jackson playframework-json

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

有人发现我的错误吗?

非常感谢,
乔尔

2 个答案:

答案 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._