有条件地转换 Json

Conditionally transforming a Json

我想仅当字段 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

我看到有几种方法可以在不完全手动构建 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)
    }
  }
}