3

Play 2.1 で JSON へのクラスの書き込みを処理する一般的な方法を作成しようとしています。使用している型Pkごとに個別に作成するのは無駄だと思います。Pkこれが私がこれまでに持っているものです:

implicit def pkWrites[E] = new Writes[Pk[E]] {
    def writes(pk: Pk[E]): JsValue = Json.toJson(pk.get)
}

...そして、私は次のようなコードでそれを使用します:

Json.toJson(Id(42L))

さて、この種の作品(Scalaはそれを見つけます)が、ここに私が得るエラーがあります:

No Json deserializer found for type E. 
Try to implement an implicit Writes or Format for this type.

EtypeはどこにありますかLong(したがって、デシリアライザーがあります)。とにかく私はJson.toJsonタイプEが何であるかを知ることができますか?

4

1 に答える 1

2

必要な唯一のことはE、スコープ内の型のデシリアライザーがあることを確認することです。これは、使用する各型が書き込み可能であることを確認できないためです。あなたはそれを試すことができます:

class Value[A](value: A){
  def get[A] = value
}

implicit def valueWrites[E](implicit longWrites: Writes[E]) = new Writes[Value[E]]{
    def writes(value: Value[E]): JsValue = Json.toJson(value.get)
}

Json.toJson(new Value(5L))

暗黙的なメソッドを次のように短縮できます。

implicit def valueToJson[E: Writes] = new Writes[Value[E]]{
    def writes(value: Value[E]): JsValue = Json.toJson(value.get)
}

編集:

上記のこれら2つのメソッドはまったく同じです。つまり、メソッドには暗黙的な値が必要Pk[Long]であるため、このメソッドは数値を逆シリアル化する方法を知っています。つまり、E: Writesはメソッドに次のように指示します: type の暗黙の値を検索しますWrites[E]

編集2:

Json.toJson(1)Writes[Int]範囲内にあるため機能します。同じように動作しますvalueWrites[Int]Writes[Int]、スコープ内にあるため、メソッドを使用Writes[Int]してフィールドを逆シリアル化しvalue、クラス全体を逆シリアル化できます。

于 2013-06-25T19:49:07.790 に答える