Обновите ключ 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
Другие вопросы по тегам