powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / перебор элементов JSON
7 сообщений из 7, страница 1 из 1
перебор элементов JSON
    #39449095
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
привет.
БД - MySQL 5.7.
есть JSON вида
[{"a":"1","b","xx"},{"a":"2","b","yy"},{"a":"3","b","zz"}, ... ]

Вопрос : Как мне перебрать все элементы массива, например с целью проверки/обработки значений b?
Код: plsql
1.
2.
3.
4.
5.
DECLARE xJSON json;
DECLARE xElement varchar(255);
SET xJSON = CAST('[{"a":"1","b","xx"},{"a":"2","b","yy"},{"a":"3","b","zz"}]' as json);
SET xElement = xJSON->>'$[0]."b"';
SET xElement = xJSON->>concat('$[',1,']."b"');

если я чётко задаю номер элемента массива, то всё отрабатывает нормально.
при попытке построить path динамически, или, например, сначала построить строку пути, и передать её в качестве параметра - выдаёт ошибку синтаксиса.
В Гугл-Яндексе в первых страницах результатов поиска ничего не нашел.
Единственный извращенный (на мой взгляд) способ который мне удалось придумать - в цикле вырезАть из JSON-а элемент, который я уже обработал и обращаться к нулевому до тех пока что-то будет определяться.
...
Рейтинг: 0 / 0
перебор элементов JSON
    #39449106
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Darkrippleпри попытке построить path динамически, или, например, сначала построить строку пути, и передать её в качестве параметра - выдаёт ошибку синтаксиса.Вы хотя бы покажите эти попытки... а то пока не сильно понятно, что требуется. Даже сам JSON не сильно похож на валидный:
Код: sql
1.
2.
mysql> SET @xJSON = CAST('[{"a":"1","b","xx"},{"a":"2","b","yy"},{"a":"3","b","zz"}]' as json);
ERROR 3141 (22032): Invalid JSON text in argument 1 to function cast_as_json: "Missing a colon after a name of object member." at position 14.


Если же надо, скажем, выгрести весь набор значений компонента b - используйте соотв. функцию:
Код: sql
1.
2.
3.
4.
5.
6.
7.
mysql> SELECT JSON_EXTRACT('[{"a":"1","b":"xx"},{"a":"2","b":"yy"},{"a":"3","b":"zz"}]', '$**.b') b_values;
+--------------------+
| b_values           |
+--------------------+
| ["xx", "yy", "zz"] |
+--------------------+
1 row in set (0.01 sec)
...
Рейтинг: 0 / 0
перебор элементов JSON
    #39449122
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Akina]DarkrippleДаже сам JSON не сильно похож на валидный:
извиняюсь, редактировал строку в уже в сообщении, не заметил что там запятые вместо двоеточий.
да, правильный такой:
'[{"a":"1","b":"xx"},{"a":"2","b":"yy"},{"a":"3","b":"zz"}]'

мне нужно последовательно обработать объекты в массиве.
то есть, по приведенному примеру, превратить вот это:
Код: plsql
1.
2.
3.
4.
5.
6.
BEGIN
  [обработка значений xJSON->>'$[0]."a"' и xJSON->>'$[0]."b"'];
  [обработка значений xJSON->>'$[1]."a"' и xJSON->>'$[1]."b"'];
  [ ... ];
  [обработка значений xJSON->>'$[n]."a"' и xJSON->>'$[n]."b"'];
end;

вот в такое
Код: plsql
1.
2.
3.
4.
5.
6.
7.
begin
  set i = 0;
  while i < JSON_LENGTH(xJSON)do
    [обработка значений xJSON->>'$[i]."a"' и xJSON->>'$[i]."b"'];
    set i=i+1;
  end while;
end;
...
Рейтинг: 0 / 0
перебор элементов JSON
    #39449127
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пока из работающих у меня только такое решение:
Код: plsql
1.
2.
3.
4.
5.
6.
begin
  while JSON_LENGTH(xJSON) > 0 do
    [обработка значений xJSON->>'$[0]."a"' и xJSON->>'$[0]."b"'];
    set xJSON= JSON_REMOVE(xJSON,'$[0]');
  end while;
end;
...
Рейтинг: 0 / 0
перебор элементов JSON
    #39449162
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
DROP PROCEDURE IF EXISTS test;

DELIMITER @@;

CREATE PROCEDURE test()
BEGIN
	DECLARE xJSON json;
	DECLARE i INT DEFAULT 0;
	DECLARE a VARCHAR(16);
	DECLARE b VARCHAR(16);
	SET xJSON = CAST('[{"a":"1","b":"xx"},{"a":"2","b":"yy"},{"a":"3","b":"zz"}]' as json);
	WHILE JSON_EXTRACT(xJSON,CONCAT('$[',i,']')) IS NOT NULL DO
			SET a = JSON_EXTRACT(xJSON,CONCAT('$[',i,'].a'));
			SET b = JSON_EXTRACT(xJSON,CONCAT('$[',i,'].b'));
			SELECT i, a, b;
		SET i=i+1;
	END WHILE;
END;
@@;

DELIMITER ;

CALL test();

DROP PROCEDURE IF EXISTS test;
...
Рейтинг: 0 / 0
перебор элементов JSON
    #39449352
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
спасибо за работающий вариант, благодаря ему я понял что не так.
оказывается, вот так работает
Код: plsql
1.
SET b = JSON_EXTRACT(xJSON,CONCAT('$[',i,'].b'));

а вот так - нет
Код: plsql
1.
SET b = xJSON->>CONCAT('$[',i,'].b');

учту на будущее.
Спасибо!
...
Рейтинг: 0 / 0
перебор элементов JSON
    #39449364
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Darkrippleа вот так - нет
Код: plsql
1.
SET b = xJSON->>CONCAT('$[',i,'].b');


Старайтесь различать, где допустимо выражение, а где требуется литерал.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / перебор элементов JSON
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]