2015-09-03 59 views
2

我想僅在字段a爲真時保留字段b。有條件地轉換Json

{"a": true, "b": "value"} => {"a": true, "b": "value"} 
{"a": false, "b": "value"} => {"a": false} 

我該如何使用Reads [JsObject]做到這一點?

val blah: Reads[JsObject] = { 
    (__ \ 'a).json.pickBranch and 
    (__ \ 'b).json.pickBranch 
}.reduce 

回答

1

我看到一些方法,你可以做到這一點,而無需手動完成AST。根據你想要挑選或修剪的領域,一個將比另一個更簡潔。將變換拉出到一個變量會讓你無法每次創建它。

val reads1: Reads[JsObject] = new Reads[JsObject] { 
    val prune = (__ \ 'b).json.prune 
    override def reads(json: JsValue): JsResult[JsObject] = { 
    (json \ "a").as[Boolean] match { 
     case true => json.validate[JsObject] 
     case false => json.transform(prune) 
    } 
    } 
} 

val reads2: Reads[JsObject] = new Reads[JsObject] { 
    val pick = (__ \ 'a).json.pickBranch 
    override def reads(json: JsValue): JsResult[JsObject] = { 
    (json \ "a").as[Boolean] match { 
     case true => json.validate[JsObject] 
     case false => json.transform(pick) 
    } 
    } 
}