Обновите ключ Jsobject значения ключа в Scala
Я знал, что мы можем обновить JsObject по ключу, однако, как я могу обновить ключ key в JsObject.
Например,
val queryText = (Json.parse(normalQuery) \"query" \"query_string" \"query").as[String]
Я могу получить строковое значение, однако, как я могу его обновить?
updatedJson ++ Json.obj("query/query_string/query" -> Json.toJson("new_test"))
Это не сработало.
1 ответ
Решение 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