3

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 ) も、私が取ったアプローチを示唆しているようです。

誰かが私の間違いを見つけますか?

どうもありがとう、
ジョエル

4

2 に答える 2

6

エラー メッセージは、問題の内容を示しています。戻り値の型は

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

Taskだから、あなたがをラップするのではなく、 を直接返しているように私には見えますJsResult

私は Play を使用しませんが、これがコンパイラーが伝えようとしているものです。

それで、それを考えると、問題は何ですか?Play 2.0 のドキュメントを見ると、readsa を返すと書かれています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 に答える