Выражения JSONPath
Несколько функций JSON принимают выражения JSON Path. MariaDB определяет этот путь следующим образом:
Синтаксис JSON Path
path : ['lax'] '$' [step]*
Путь начинается с необязательного режима пути. В настоящее время MariaDB поддерживает только режим "lax", который также используется, когда он не указан явно.
Символ $ представляет текущий элемент. Поиск всегда начинается с текущего элемента; поэтому путь всегда начинается с $.
Затем за ним следуют ноль или более шагов, которые выбирают элемент(ы) в документе JSON. Шаг может быть одним из следующих:
- Выбор члена объекта
- Выбор элемента массива
- Выбор с подстановкой
Выбор члена объекта
Для выбора члена(ов) в объекте JSON можно использовать одно из следующих:
-
.memberNameвыбирает значение члена с именем memberName. -
."memberName"— то же самое, что и выше, но позволяет выбрать члена с именем, которое не является допустимым идентификатором (то есть содержит пробелы, точки и/или другие символы). -
.*— выбирает значения всех членов объекта.
Если текущий элемент является массивом (а не объектом), ничего не будет выбрано.
Выбор элемента массива
Для выбора элементов массива можно использовать одно из следующих:
-
[N]выбирает элемент с номером N в массиве. Элементы нумеруются с нуля. -
[*]выбирает все элементы в массиве.
Если текущий элемент является объектом (а не массивом), ничего не будет выбрано.
Начиная с MariaDB сервера 10.9, JSON путь также поддерживает отрицательные индексы в массивах, ключевое слово 'last' и обозначение диапазона ('to') для доступа к элементам массива. Отрицательные индексы начинаются с -1.
-
[-N]выбирает n-ый элемент с конца. -
[last-N]выбирает n-ый элемент с конца. -
[M to N]выбирает диапазон элементов, начиная с индекса M до N.
Пример:
SET @json='{
"A": [0,
[1, 2, 3],
[4, 5, 6],
"seven",
0.8,
true,
false,
"eleven",
[12, [13, 14], {"key1":"value1"},[15]],
true],
"B": {"C": 1},
"D": 2
}';
SELECT JSON_EXTRACT(@json, '$.A[-8][1]');
+--------------------------------------------------+
| JSON_EXTRACT(@json, '$.A[-8][1]') |
+--------------------------------------------------+
| 5 |
+--------------------------------------------------+
SELECT JSON_EXTRACT(@json, '$.A[last-7][1]');
+-----------------------------------------------+
| SELECT JSON_EXTRACT(@json, '$.A[last-7][1]'); |
+-----------------------------------------------+
| 5 |
+-----------------------------------------------+
SET @json= '[
[1, {"key1": "value1"}, 3],
[false, 5, 6],
[7, 8, [9, {"key2": 2}, 11]],
[15, 1.34, [14], ["string1", [16, {"key1":[1,2,3,[4,5,6]]}, 18]]],
[19, 20],
21, 22
]';
SELECT JSON_EXTRACT(@json, '$[0 to 3][2]');
+-----------------------------------------------+
| JSON_EXTRACT(@json, '$[0 to 3][2]') |
+-----------------------------------------------+
| [3, 6, [9, {"key2": 2}, 11], [14]] |
+-----------------------------------------------+
Это выведет результат для первого индекса восьмого элемента с конца двухмерного массива.
Примечание: в обозначении диапазона, когда M > N (когда M,N больше или равны 0) или (размер массива - M или размер массива - N, когда M, N меньше 0), он рассматривается как недопустимый диапазон, и возвращается NULL.
SET @json= '[1, 2, 3, 4, 5]'; SELECT JSON_EXTRACT(@json, '$[4 to 2]'); +-----------------------------------+ | JSON_EXTRACT(@json, '$[4 to 2]') | +-----------------------------------+ | NULL | +-----------------------------------+
Подстановка
Шаг подстановки, **, рекурсивно выбирает все дочерние элементы текущего элемента. Выбираются как элементы массива, так и члены объекта.
Шаг подстановки не должен быть последним шагом в выражении JSONPath. За ним должен следовать шаг выбора элемента массива или члена объекта.
Например:
select json_extract(@json_doc, '$**.price');
выберет все члены объекта в документе, чьи имена price, в то время как
select json_extract(@json_doc, '$**[2]');
выберет второй элемент в каждом из массивов, присутствующих в документе.
Совместимость
Синтаксис JSONPath MariaDB поддерживает подмножество определения JSON Path в стандарте SQL. Наиболее заметными неподдерживаемыми элементами являются режим strict и фильтры.
JSONPath MariaDB близок к JSONPath MySQL. Шаг подстановки (**) — это нестандартное расширение, имеющее такое же значение, как и в MySQL. Разница между JSONPath MariaDB и MySQL заключается в том, что MySQL не позволяет явно указать режим (но использует режим lax неявно).
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/jsonpath-expressions/