2017-06-07 1 views
2

Play Framework (2.5.1)を調べるのに数時間しかかからず、ReadsWritesを既に定義したときにFormatを作成する理由が混乱しています。あなたのクラスにReadsWritesを定義することによって、クラスを変換するために必要なすべての機能を定義していないかJsValueReads [T]とWrites [T]がある場合、Format [T]の目的は何ですか?

+0

あなたの質問に答えた場合、回答を受け入れることができますか? –

答えて

8

プレイフレームワークのドキュメントで述べたようにhere

フォーマット[T]は読み込みや特徴を書き込み、そのコンポーネントの代わりに、暗黙的な変換のために を用いることができるだけのミックスです。

フォーマットは、Reads [T]とWrites [T]の組み合わせです。したがって、T型に対して暗黙的なFormat [T]を1つ定義し、T型に対して暗黙のReads [T]とWrites [T]を定義するのではなく、Jsonを読み書きするために使用することができます。あなたのタイプTとFormat [T]のために定義された[T]は必要とされず、その逆も同様です。

Formatの利点の1つは、両方が対称(ReadsとWrites)の場合、2つの別々のReads [T]とWrites [T]を定義するのではなく、 。したがって、Formatを使用すると、JSON構造の定義の繰り返しが少なくなります。たとえば、次のようなことができます。

implicit val formater: Format[Data] = (
    (__ \ "id").format[Int] and 
    (__ \ "name").format[String] and 
    (__ \ "value").format[String] 
) (Data.apply, unlift(Data.unapply)) 

implicit val dataWriter: Writes[Data] = (
    (__ \ "id").write[Int] and 
    (__ \ "name").write[String] and 
    (__ \ "file_type").write[String] 
) (Data.apply) 

implicit val dataWriter: Reads[Data] = (
    (__ \ "id").read[Int] and 
    (__ \ "name").read[String] and 
    (__ \ "file_type").read[String] 
) (unlift(Data.unapply)) 
関連する問題