Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для skelmen
10 / 10 / 3
Регистрация: 03.04.2015
Сообщений: 130

Как переименовать ключи объектов в jsonb array в цикле?

06.01.2021, 11:45. Показов 2875. Ответов 2

Студворк — интернет-сервис помощи студентам
Допустим есть такой массив из елементов:
Code
1
2
3
4
5
6
7
8
9
10
11
12
[{
"some_key" : 5,
"another_key" : {
            nested_key: "value"
       },
},
{
"some_key" : 231,
"another_key" : {
            nested_key: "data"
       },
}]
Суть задачи: перевести все ключи в camel case (в том числе вложенные), т.е. привести к такому виду каждый объект массива:
Code
1
2
3
4
5
6
{
"someKey" : 231,
"anotherKey" : {
            nestedKey: "data"
       },
}
Функцию для перевода стринги в camel case я уже написал. Не знаю как переименовать ключи объекта в цикле
Помогите, пожалуйста, уже 4 дня мучаюсь. Вот что у меня сейчас есть:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE OR REPLACE FUNCTION jsonb_arr_to_camel_case(j_array jsonb)
RETURNS jsonb
AS $$
DECLARE 
  el jsonb;
  new_obj jsonb;
  text_arr text[];
  new_arr jsonb[];
  i record;
BEGIN
  FOR el IN SELECT * FROM jsonb_array_elements(j_array)
  loop
    FOR i IN SELECT * FROM jsonb_each_text(el)
        loop
                       --do some logic here
      el := el::jsonb - i.key || jsonb_build_object(to_camel_case(i.key), i.value);
      END loop;
            -- do some logic here
  END loop;
  RETURN j_array;
END;
$$ LANGUAGE plpgsql stable;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2021, 11:45
Ответы с готовыми решениями:

Переименовать ключи реестра
есть имя параметра реестра стринг task_xxxx- содержит хххх х-0-9. Как сделать так, чтоб каждые десять секунд одна точка в его имени...

Переименовать ключи массива
Когда данные приходят с формы, было бы удобно использовать функцию, которая переименует ключи определенным образом (скажем в более...

Как в цикле считать все ветви и ключи файла реестра
Подскажите, как открыть указанный файл реестра? Как в цикле считать все ветви и ключи файла реестра?

2
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
06.01.2021, 23:20
А не рассматривали случай через регулярные выражения?
Переводим jsonb в строку, в строке через РегВыр меняем все нужные ключи, новую строку объявляем jsonb-результатом.
Что-то типа

Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
CREATE OR REPLACE FUNCTION to_camel_case(text)
    returns text
    language plpgsql
AS $BODY$
DECLARE
    s alias FOR $1;
    tokens_rec RECORD;
BEGIN
    s := LOWER(s);
    FOR tokens_rec IN SELECT regexp_matches(s, '_[a-z]', 'g') AS val
    LOOP
        s := REGEXP_REPLACE(s, tokens_rec.val[1], UPPER(substring(tokens_rec.val[1] FROM 2)), 'g');
    END LOOP;
    RETURN s;
END;
$BODY$;
 
CREATE OR REPLACE FUNCTION apply_camel_case(jsonb)
    returns jsonb
    language plpgsql
AS $BODY$
DECLARE
    jin alias FOR $1;
    jtext text := jin::text;
    key_rec RECORD;
BEGIN
    FOR key_rec IN SELECT * FROM jsonb_all_object_keys(jin) AS key_cur(key_name)
    LOOP
        jtext := REGEXP_REPLACE(jtext, 
            '"' || key_rec.key_name || '"',
            '"' || to_camel_case(key_rec.key_name) || '"',
            'g');
    END LOOP;
    RETURN jtext::jsonb;
END;
$BODY$;
Code
1
2
3
4
5
test=> select apply_camel_case('{"some_key": 231, "another_key": {"nested_key": "data", "yet_another_nested_key": 45}}'::jsonb);
                                 apply_camel_case                                 
----------------------------------------------------------------------------------
 {"someKey": 231, "anotherKey": {"nestedKey": "data", "yetAnotherNestedKey": 45}}
(1 строка)
Есть плюсы и минусы работы со строками и РегВыр, но может подойдет.
1
 Аватар для skelmen
10 / 10 / 3
Регистрация: 03.04.2015
Сообщений: 130
08.01.2021, 11:14  [ТС]
Не рассматривал ))
Спасибо вам за наводку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2021, 11:14
Помогаю со студенческими работами здесь

Вводить ключи в цикле и создавать различные обьекты
Здравствуйте!Как решить такое задание? User, Looser, Coder and Proger 1. Ввести с клавиатуры несколько строк (ключей). Строки(ключи)...

Сделать фабрику фильмов вводя ключи в цикле
Здравствуйте!Как решить такую задачу? MovieFactory Расширение функционала по аналогии, чтение с консоли: 1. Разобраться, что...

Как менять свойства сразу нескольких объектов в цикле?
Суть в том, что у меня много numericUpDown и один CheckBox. При установки значения CheckBox.Checked, нужно изменить у всех...

Как заполнить массив объектов, изменяя имя объекта в цикле for?
К сожалению, не смог найти понятного объяснения того, как изменять имя объекта в цикле matlab, чтобы затем поместить его в ячейку массива....

Как запретить в триггере вставку пустого jsonb
СУБД Postgresql, нужно в триггере запретить вставку в поле пустого '{}'::jsonb Пробовал что-то подобное, но не работает BEGIN ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru