2017-08-14 46 views
1

我有以下代碼發揮JSON工作播放JSON面色不在這種情況下

進口play.api.libs.json.Json

trait A { 
    def x: Option[Int] 

    def y: Option[String] 
} 

case class A1(x: Option[Int] = Some(1), y: Option[String]) extends A 

object PlayJsonBug { 
    def main(args: Array[String]): Unit = { 
    implicit val A1Reader = Json.reads[A1] 
    implicit val A1Writer = Json.writes[A1] 
    val str = """{"y":"xyz"}""" 
    val a: A1 = Json.fromJson[A1](Json.parse(str)).get 
    println(a) 
    } 


} 

案例類A1具有默認值x運作良好這是Some (1)。 當我分析{"y":"xyz"},結果是A1(None,Some(xyz)),我認爲默認值應該用在這裏,是那朵,結果應該是A1(Some(1),Some(xyz))

這是一個錯誤嗎?要不我怎麼能解決這個問題

+0

我想知道您正在使用的播放JSON的版本。我記得瀏覽了play-json的git歷史,並且看到最近(也就是不到一年的時間)提交與使用默認參數處理case類有關的提交。我不記得細節但是... –

+0

感謝@ FredericA.I使用播放2.6.0 – Tom

回答

5

Json.reads是一個scala宏,其實現不關心默認值,因爲它只遍歷所有類的case訪問器。您將需要實現自己的play.api.libs.json.Reads以支持在json中找不到值時回退到默認參數。

它可能看起來像這樣(用於播放2.5.X):

implicit object A1Reads extends Reads[A1] { 

    private val generatedReads = Json.reads[A1] 

    override def reads(json: JsValue): JsResult[A1] = { 
     // re-use reads, but replace None for x with default param 
     generatedReads.reads(json).map { 
      case A1(None, y) => A1(Some(1), y) 
      case valid => valid 
     } 
    } 
} 
+0

感謝@dexmo爲有用的答案! – Tom