【问题标题】:Serialize objects with Play Scala api and Json使用 Play Scala api 和 Json 序列化对象
【发布时间】:2012-12-25 19:55:04
【问题描述】:

我尝试使用 Scala 将我的模型在 play 2.0 应用程序中序列化为 Json。这就是我的代码的样子:

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

有人发现我的错误吗?

非常感谢,
乔尔

【问题讨论】:

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


    【解决方案1】:

    错误信息告诉你问题出在哪里:返回类型必须是

    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

    【讨论】:

    • 好吧,也许我现在真的看不到它,但这对我没有多大帮助。我得到了编译器告诉我的内容,但我不知道如何返回JsResult[Task]。网络上的所有文档似乎也有与我相同的代码(例如playframework.org/documentation/2.0.1/ScalaJsonGenericsstackoverflow.com/questions/11979638/…)。
    • @jomikr - 编辑了我的答案,因为我弄清楚了发生了什么。
    • 感谢您指出这一点。我没想到他们以这种方式更改了 api。查看源代码终于让我找到了解决方案:def reads(json: JsValue) = JsSuccess(Task( (json \ "id").as[Long], (json \ "label").as[String], (json \ "date").as[String]))
    【解决方案2】:

    根据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._
    

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 2017-05-15
      相关资源
      最近更新 更多