2017-06-09 3 views
2

デフォルトのパラメータに問題があり、Play Json Readを使用しています。ここ は私のコードです:私は最後に取得することを期待していた何caseクラスのjson ReadとDefaultパラメータを再生しますか?

case class Test(action: String, storeResult: Option[Boolean] = Some(true), returndata: Option[Boolean] = Some(true)) 

    val json = 
    """ 
     {"action": "Test"}""" 

    implicit val testReads: Reads[Test] = 
    (
     (JsPath \\ "action").read[String](minLength[String](1)) and 
     (JsPath \\ "store_result").readNullable[Boolean] and 
     (JsPath \\ "returndata").readNullable[Boolean] 
    ) (Test.apply _) 
    val js = Json.parse(json) 

    js.validate[Test] match { 
    case JsSuccess(a, _) => println(a) 
    case JsError(errors) => 
     println("Here") 
     println(errors) 
    } 

Test("Test", Some(true), Some(true)) 

ですが、私は得た:

Test("Test",None,None) 

これがそうであるのはなぜ?私がjsonでパラメータを指定しなかった場合、なぜデフォルト値が得られなかったのですか?どのように私が欲しいものを達成するために?

答えて

1

デフォルトパラメータのサポートがバージョン2.6であるかのように見えます。

以前のバージョンを回避するには、次のような何かを行うことです:あなたは、デフォルト値を供給する場合

object TestBuilder { 
    def apply(action: String, storeResult: Option[Boolean], returndata: Option[Boolean]) = 
    Test(
     action, 
     Option(storeResult.getOrElse(true)), 
     Option(returndata.getOrElse(true)) 
    ) 
} 

implicit val testReads: Reads[Test] = 
    (
    (JsPath \\ "action").read[String](minLength[String](1)) and 
    (JsPath \\ "store_result").readNullable[Boolean] and 
    (JsPath \\ "returndata").readNullable[Boolean] 
)(TestBuilder.apply _) 
0

は、あなたが本当にあなたのケースのクラスのオプションは必要ですか?オプションを指定せずに、あなたがオプションが必要な場合は、次のコードは、

case class Test(action: String, storeResult: Boolean = true, returndata: Boolean = true) 

    implicit val testReads: Reads[Test] = 
    (
     (JsPath \\ "action").read[String](minLength[String](1)) and 
     ((JsPath \\ "store_result").read[Boolean] or Reads.pure(true)) and 
     ((JsPath \\ "returndata").read[Boolean] or Reads.pure(true)) 
    ) (Test.apply _) 

を動作するはずです、このコードは(テストしていない!)うまくいくかもしれないプレイ2.6で

case class Test(action: String, storeResult: Option[Boolean] = Some(true), returndata: Option[Boolean] = Some(true)) 


    implicit val testReads: Reads[Test] = 
    (
     (JsPath \\ "action").read[String](minLength[String](1)) and 
     ((JsPath \\ "store_result").read[Boolean] or Reads.pure(true)).map(x=>Some(x)) and 
     ((JsPath \\ "returndata").read[Boolean] or Reads.pure(true)).map(x=>Some(x)) 
    ) (Test.apply _) 
2

あなたは、単に書くことができます。

Json.using[Json.WithDefaultValues].reads[Test] 
+0

これを'Play-Json 2.6.x'の最も適切な答えです –