2017-06-19 8 views
0

22フィールドの制限のため、大文字のクラスをより小さなクラスに分割する必要がありました。この大きなクラスのWritesをどうすれば平滑化できますか?プレーでの書き込みの平滑化

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 

case class B(x: Option[Int], y: Option[Int]) 

object B { 
    implicit val format: (Reads[B], Writes[B]) => Format[B] = Format[B] 
} 

case class C(z: Option[Int], w: Option[Int]) 

object C { 
    implicit val format: (Reads[C], Writes[C]) => Format[C] = Format[C] 
} 

case class A(b: B, c: C) 

object A { 
    implicit val reads: Reads[A] = 
    (Reads.of[B] and Reads.of[C]) (A.apply _) 

    implicit val writes: Writes[A] = ??? 
    /* 
    val a = A(B(1, 2), C(3, 4) 

    Json.toJson(a) should be 

    { 
    "x": 1 
    "y": 2 
    "z": 3 
    "w": 4 
    } 
    */ 
} 

答えて

1

短編物語、あなたはこれを行うことができます。

implicit val writes: Writes[A] = JsPath.write[B].and(JsPath.write[C]) (unlift(A.unapply _)) 

長い話を:なぜあなたはandメソッドを使用することができますか?

andは、タイプライブラリFunctionalCanBuildを実装するすべてのクラスで使用できます。私が今まで気づいたのは、Writesのような型定義がないということですが、OWritesの型定義があります。

JsPath.write[B]を使用すると、OWritesという値が得られます。したがって、andの方法が利用できます。一方、Writes.of[]を使用するとWritesが得られ、OWrites.of[]Writes[]となります。最後に、OWrites[]を取得する方法は、キーワードとを使用することができます。

さらにコードを見ると、Applicative型のインスタンスはすべてFunctionalCanBuildのインスタンスに変換可能です。このタイプクラスはReadsに実装されているため、利用可能なandメソッドはReaders.

+0

これに相当するのは何ですか? –

関連する問題