如何在scala

时间:2016-11-17 03:30:55

标签: json scala

在我的代码中,我向服务器发出get请求以获取一些json,然后我想在发回之前更新其中一个值。我知道,如果密钥位于顶层,我可以通过编写

来更新密钥
val newConfig = originalConfig ++ Json.obj("key" -> newValue)

然而,如果我想要改变的关键是几层,我无法想出一个更新它的好方法。

即。我的json看起来像这样,我想更新key5

{
    "key1": "value",
    "key2": {
        "key3": "value",
        "key4": {
            "key5": "value",
            "key6": "value"
        }
    }
}

有没有办法在不逐层更新的情况下执行此操作? 即

val key4 = originalKey4 ++ Json.obj("key5" -> newValue)
val key2 = originalKey2 ++ Json.obj("key4" -> key4)
val newJson = originalJson ++ Json.obj("key2" -> key2)

我想要更新的实际密钥是7层,所以这相当繁琐。

1 个答案:

答案 0 :(得分:2)

看看json transformers

import play.api.libs.json._

val str = """{
            |    "key1": "value",
            |    "key2": {
            |        "key3": "value",
            |        "key4": {
            |            "key5": "value",
            |            "key6": "value"
            |        }
            |    }
            |}""".stripMargin

val json = Json.parse(str)

val transformer = (__ \ 'key2 \ 'key4 \ 'key5).json.update(
  __.read[JsString].map(_ => Json.toJson("updated value"))
)

val result = json.transform(transformer).asOpt.get

Json.prettyPrint(result)

res0: String = {
  "key1" : "value",
  "key2" : {
    "key3" : "value",
    "key4" : {
      "key5" : "updated value",
      "key6" : "value"
    }
  }
}