Spec-Zone.ru › MariaDB

Выражения 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 неявно).

Содержимое, воспроизводимое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительную проверку MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API