我知道我们可以通过键更新JsObject,但是,如何在JsObject中更新key的键。
例如,
val queryText = (Json.parse(normalQuery) \"query" \"query_string" \"query").as[String]
我可以获取字符串值,但是,如何更新呢?
updatedJson ++ Json.obj("query/query_string/query" -> Json.toJson("new_test"))
这不起作用。
答案 0 :(得分:0)
解决方案1
您应该阅读JsPath上的文档。您正在寻找的方法是JsPath.json.update
:
import play.api.libs.json._
val baseJson = Json.obj("query" -> Json.obj("query_string" -> Json.obj("query" -> "old_value")))
val updater: Reads[JsObject] = __.json.update((__ \"query" \"query_string" \"query").json.put(JsString("new_value")))
val updated: JsResult[JsObject] = baseJson.transform(updater)
解决方案2
您也可以尝试使用++
添加字段,但需要正确定义对象:
val overrider = Json.obj("query" -> Json.obj("query_string" -> Json.obj("query" -> "new_value")))
val badOverriden = baseJson ++ overrider
实际上,这不起作用,因为++
不是递归的:它只覆盖JSON对象顶层的字段。但是,您可以使用递归执行相同的deepMerge
:
val overriden = baseJson deepMerge overrider