在我的代码中,我向服务器发出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层,所以这相当繁琐。
答案 0 :(得分:2)
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"
}
}
}