有条件地改造Json

时间:2015-09-03 00:30:56

标签: json scala playframework transformation

我想仅在字段a为真时才保留字段b。

{"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 个答案:

答案 0 :(得分: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)
    }
  }
}