Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / перебор элементов JSON / 7 сообщений из 7, страница 1 из 1
05.05.2017, 08:12
    #39449095
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перебор элементов JSON
привет.
БД - 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
05.05.2017, 08:40
    #39449106
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перебор элементов JSON
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
05.05.2017, 09:03
    #39449122
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перебор элементов JSON
[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
05.05.2017, 09:09
    #39449127
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перебор элементов JSON
пока из работающих у меня только такое решение:
Код: 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
05.05.2017, 09:44
    #39449162
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перебор элементов JSON
Код: 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
05.05.2017, 13:14
    #39449352
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перебор элементов JSON
Akina,
спасибо за работающий вариант, благодаря ему я понял что не так.
оказывается, вот так работает
Код: plsql
1.
SET b = JSON_EXTRACT(xJSON,CONCAT('$[',i,'].b'));

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

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


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


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