3

PlayアクションからJsonを返すために使用する関数の1つを一般化しようとしています。

私は現在このようにしています:

def JsendOkObj(obj: JsValue) = Ok(Json.obj("status" -> "success", "data" -> obj))

そしてそれを呼びます:

JsendOkObj(Json.toJson(myObj))

もっと次のようなことをしたいのですが。

def JsendOkObj[A](obj: A) = Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))

そしてそれを次のように呼びます:

JsendOkObj(myObj)

ここで、Json.toJsonは次のように定義されます。

def toJson[A](implicit arg0: Writes[A]): Enumeratee[A, JsValue]

これをコンパイルするときに発生するエラーは、タイプの書き込みを定義する必要があることですAAどのタイプが実際に最終的になるかわからないため、ここではこれは不可能です。

タイプAのJsonデシリアライザーが見つかりません。このタイプの暗黙的な書き込みまたはフォーマットを実装してみてください。

4

1 に答える 1

12

次のように、独自のメソッドに暗黙的なパラメータリストを追加することで、Writes[A]呼び出し時に暗黙的なパラメータがスコープ内にあることを確認できます。toJSon

def JsendOkObj[A](obj: A)(implicit w: Writes[A]) =
  Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))

これは、型クラスインスタンスを明示的にtoJson:に渡すことと同じです。

def JsendOkObj[A](obj: A)(implicit w: Writes[A]) =
  Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)(w)))

ここでバインドされたコンテキストを使用することもできることに注意してください。

def JsendOkObj[A: Writes](obj: A) =
  Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))

これは、上記の私の最初のバージョンの単なる構文糖衣です。

于 2013-01-29T11:38:08.830 に答える