0

我知道我们可以通过 key 更新 JsObject,但是,如何更新 JsObject 中的 key 的 key。

例如,

val queryText = (Json.parse(normalQuery) \"query" \"query_string" \"query").as[String]

我可以获得字符串值,但是,如何更新它?

  updatedJson ++ Json.obj("query/query_string/query" -> Json.toJson("new_test"))

这没有用。

4

1 回答 1

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
于 2017-03-22T22:56:04.357 回答