2016-12-06 3 views
0

を私はJSONにケースクラスを変換する関数を記述したいと思います:Scalaは再生:「JSON書き込み可能なクラス」を定義する方法

import play.api.libs.json._ 

def myJson(cc: Product): JsValue = { 
    Json.toJson(cc) // simplified 
} 

各ケースクラスは、例えば、暗黙のWrites[T]があります

case class Test(a: Int) 
object Test { 
    implicit val jsonWrites: Writes[Test] = Json.writes[Test] 
} 

Json.toJson(new Test(1))を個別に書き込むことはできますが、ccに暗黙的な書き込みが定義されているかどうかわからないため、上記の関数myJsonはコンパイルされません。

[それは暗黙のWritesを持つクラスのみをとるようにどのように私は、関数のシグネチャを書き込むことができますか?]

編集:それだけで暗黙のWritesを持つクラスに対応するように、どのように機能入力タイプを書き込むことができますか?

trait JsonWritableResult[T <: Product] { 
    implicit val jsonWrites: Writes[T] 
} 

case class Test(a: Int) 
object Test extends JsonWritableResult[Test] { 
    implicit val jsonWrites: Writes[Test] = Json.writes[Test] 
} 

def myJson(cc: JsonWritableResult[_ <: Product]): JsValue = { 
    Json.toJson(cc) 
} 

しかし、それは言う"タイプmodels.JsonWritableResult [_ $ 2]が見つかりませんJSONシリアライザ":

は、私はこれを試してみました。

+0

あなたは、任意のケースクラスのカスタムmyJson機能をしたいですかなぜ? Json.toJsonとはどう違うのですか? – Tyth

+0

私は120のそのようなケースクラスを持っているだけなので、私は多くの異なるJson結果を返すために120個のコントローラを書いたくありません。一般的な関数が最適です。 – JulienD

+0

@Tyth実際は暗いかもしれませんが、まだ実現していないことに注意してください) – JulienD

答えて

1

このようなものは、あなたに必要な行動を与えるようです。

import play.api.libs.json.{JsValue, Json, Writes} 

trait Product {} 

case class Test(a: Int) extends Product 
object Test { 
    implicit val jsonWrites: Writes[Test] = Json.writes[Test] 
} 

def myJson[T <: Product](cc: T)(implicit writes: Writes[T]): JsValue = { 
    Json.toJson(cc) // simplified 
} 

import Test._ 

myJson(Test(3)) 

これは一般的なケースではテストされていませんが、ワークシートでは動作するようです。

0

ケースクラスに暗黙的に強制するのではなく、ケースクラスで暗黙的に定義されたものを使用するかどうかを、特性からtoJsonメソッドをオーバーライドする方が賢明です。はるかに簡単で動作します。次に、私の工場は出力型でこの特性を明示することができます。したがって、出力するものをシリアル化できます。

しかし、他の答えは私が間違って策定質問に答えているので、私はそれを受け入れる;)