解决方案 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