Заменить текстовый элемент json с помощью jsonb_set

Есть json вида:

{"id": null , "answer": [{"code": "22", "information": "Заявка не одобрена, не указаны персональные данные клиента"}], "status": "error"}

необходимо заменить данные в поле information. До этого получалось изменять числовые данные с помощью jsonb_set, в данном json не получается это осуществить.

Пробовала запросом

UPDATE statement set metadata = jsonb_set (metadata, array['answer', 'information'], '"Заявка не одобрена, не соответствует дата рождения клиента"')where id_jon = 'as2536'

Вероятнее всего не правильно составляю запрос, подскажити как решить проблему?


Ответы (1 шт):

Автор решения: Мелкий

"answer": [{

У вас массив объектов. Поэтому собственно jsonb_set вам даёт ошибку

ERROR:  path element at position 2 is not an integer: "information"

Это не имеет отношения к типу изменяемого элемента, это про указанный путь до этого элемента. На втором уровне вложенности у вас массив, у json массива ключ не может быть строкой, только числом. Если указать, что нас интересует нулевой элемент массива array['answer', '0', 'information'] - то всё получится.

melkij=> select jsonb_set(
        '{"id": null , "answer": [{"code": "22", "information": "Заявка не одобрена, не указаны персональные данные клиента"}], "status": "error"}', 
        array['answer', '0', 'information'], '"За"');
                                    jsonb_set                                     
----------------------------------------------------------------------------------
 {"id": null, "answer": [{"code": "22", "information": "За"}], "status": "error"}
→ Ссылка