4

JSON と Play Framework 2.1.0 および Scala 2.10 を使用してシリアライズ/デシリアライズしようとしています。私は Anorm を使用しており、データベースに保存したい非常に単純なオブジェクトがあります。注文は非常に簡単です。

case class Order(id: Pk[Long] = NotAssigned, mfg: String, tp: String)

私のコントローラーでは、REST インターフェイスを構築して、Order インスタンス (上記) を JSON として受け入れて送信できるようにしようとしています。そこには、次のコードがあります。

  implicit object PkFormat extends Format[Pk[Long]] {
     def reads(json: JsValue):Pk[Long] = Id(json.as[Long])
     def writes(id: Pk[Long]):JsNumber = JsNumber(id.get)
  }

ただし、次のように「プレイ テスト」を実行すると、これはコンパイルに失敗します。

タイプ (json: play.api.libs.json.JsValue)play.api.libs.json.JsResult[anorm.Pk[Long]]; [エラー] メソッドの読み取りに互換性のない型があります [エラー] def 読み取り(json: JsValue):Pk[Long] = Id(json.as[Long])

なぜこれが起こっているのか誰にも分かりますか?

私は JAXB の経験が豊富ですが、Play と Scala についてはまったくの初心者で、これまでのところ答えを見つけることができませんでした。これは非常に単純な使用例のように思えます。実際には、より単純な解決策 (注釈など) があることを望んでいましたが、見つけることができませんでした (少なくともまだ)。

どんな助けでも大歓迎です!

ありがとう

4

1 に答える 1

5

play.api.libs.json.Readstrait はreadsメソッドを次のように定義します。

def reads(json : play.api.libs.json.JsValue) : play.api.libs.json.JsResult[A]

JsResult[A]したがって、reads メソッドの応答はではなくであると予想されますA。つまり、 ではJsResult[Pk[Long]]ありませんPk[Long]。成功した場合、これを返す必要があります。

implicit object PkFormat extends Format[Pk[Long]] {
    def reads(json: JsValue):JsResult[Pk[Long]] = JsSuccess(Id(json.as[Long]))
    def writes(id: Pk[Long]):JsNumber = JsNumber(id.get)
}
于 2013-03-31T16:49:30.577 に答える