Play-json: ошибка при обновлении атрибута объекта внутри массива

Я играю с библиотекой play-json для управления файлами json. Я следил за этим официальным документом, и все работает нормально, но они не сказали случай, когда мы хотим обновить значение объекта внутри массива, поэтому я пробую это на своем собственном примере.

i.e.

[
  {
    "key1": [
      {
        "key12": [
          {
            "key121": "text1",
            "key122": 121212,
            "key123": "text2",
            "key124": []
          }
        ],
        "key13": 0
      }
    ],
    "key2": "value2"
  }
]

В приведенном выше примере я пытаюсь обновить значение «key123», но снова и снова получаю эту ошибку, просто не могу понять, где я делаю неправильно :(

Исключение в потоке «основной» java.util.NoSuchElementException: JsError.get в play.api.libs.json.JsError.get(JsResult.scala:14) в play.api.libs.json.JsError.get(JsResult.scala :13) в Refactor.authPage(Refactor.scala:73) в Builder$.main(Builder.scala:36) в Builder.main(Builder.scala) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun. Reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke(Method.java:483) в com.intellij.rt .execution.application.AppMain.main(AppMain.java:140)

Вот мой код. Любая помощь будет оценена по достоинству.

val transform = (((__ (0) \ 'key1)(0) \ 'key12)(0) \ 'key123).json.update(__.read[JsString].map(x => JsString("updated")))

val jsValue = Json.parse("example.json").transform(transform).get

person Vinay    schedule 09.08.2015    source источник
comment
Json.parse("example.json").transform возвращает JsResult. Вы можете сопоставить шаблон для JsSuccess и JsError. В вашем случае вы получаете JsError. Регистрация его внутри сопоставления с образцом даст вам больше контекста ошибки.   -  person Richeek    schedule 10.08.2015
comment
Это мой JsError: {"obj":[{"msg":"error.expected.jsobject","args":[]}]}   -  person Vinay    schedule 10.08.2015


Ответы (1)


Я провел некоторое исследование в Интернете и обнаружил, что эта проблема уже обсуждалась в списке рассылки play, даже там был ticket, чтобы решить эту проблему. play-json не имеет встроенной поддержки для обновления значения внутри массива (вы можете это сделать, но тогда потребуется много работы, вам нужно обновить полный JsArray).

Однако play-json в настоящее время не поддерживает преобразование на основе индексов массива, есть вспомогательная библиотека play- json-zipper, которые поддерживают все эти функции и многое другое. Разработчики Play закрыли вышеупомянутый тикет, предполагая, что люди могут использовать play-json-zipper, если это необходимо.

P.S: добавляю свой собственный ответ, чтобы, если кто-то еще попадет сюда с помощью поиска Google, они могли легко найти решение.

person Vinay    schedule 10.08.2015