Что представляет собой JSONPath?
В данном разделе рассмотрим, как работает JSONPath на этапе предварительной обработки значений элементов. JSONPath состоит из частей, разделённых точками. Эти части могут быть простыми словами, которые представляют имена значений в формате JSON, подстановочными знаками (*), или более сложными конструкциями, заключёнными в квадратные скобки. Перед такой конструкцией, заключённой в квадратные скобки, может стоять точка, но это необязательно.
| Пример JSONPath | Описание |
|---|---|
| $.object.name | Возвращает object.name содержимое. |
| $.object['name'] | Возвращает object.name содержимое. |
| $.object.['name'] | Возвращает object.name содержимое. |
| $["object"]['name'] | Возвращает object.name содержимое. |
| $.['object'].["name"] | Возвращает object.name содержимое. |
| $.object.history.length() | Возвращает количество object.history элементов массива. |
| $[?(@.name == 'Object')].price.first() | Возвращает значение price свойства из первого объекта с именем "Object". |
| $[?(@.name == 'Object')].history.first().length() | Возвращает количество элементов массива истории из первого объекта с именем "Object". |
| $[?(@.price > 10)].length() | Возвращает количество объектов с ценой больше 10. |
Используемые сегменты
| Сегмент | Описание |
|---|---|
| < name> | Сопоставьте свойство объекта по имени. |
| * | Соответствует всем свойствам объекта. |
| [' |
Сопоставьте свойство объекта по имени. |
| [' |
Сопоставьте свойство объекта с любым из перечисленных имен. |
| [ |
Сопоставьте элемент массива по индексу. |
| [ |
Сопоставьте элемент массива по любому из перечисленных индексов. |
| [*] | Соответствует всем свойствам объекта или элементам массива. |
| [ |
Сопоставлять элементы массива по определенному диапазону: ▶ < start> - первый соответствующий индекс (включая); если не указан, соответствует всем элементам массива с начала; если отрицательный, указывает начальное смещение от конца массива; ▶ < end> - последний соответствующий индекс (исключая); если не указан, соответствует всем элементам массива до конца; если отрицательный, указывает начальное смещение от конца массива. |
| [?( |
Сопоставляйте объекты / элементы массива, применяя выражение фильтра. |
Чтобы найти нужный сегмент, игнорируя его происхождение (то есть отдельный сегмент), перед ним нужно поставить две точки (…). Например, $…name или $…[‘name’] вернёт значения всех свойств name.
Можно извлечь совпадающие имена элементов, добавив суффикс в виде тильды (~) к JSONPath. Он вернёт имя совпадающего объекта или индекс в строковом формате соответствующего элемента массива.
Формат вывода соответствует тем же правилам, что и в других запросах JSONPath:
- Результаты определённого пути возвращаются «как есть»;
- Результаты неопределённого пути возвращаются в виде массива.
Однако извлечение имени элемента, соответствующего определённому пути, имеет минимальное значение.
Выражение фильтрации
Выражение фильтра — это арифметическое выражение, записанное в инфиксной форме.
Поддерживаемые выражения:
| Выражение | Описание |
|---|---|
| "< text>", '< text>' | Текстовая константа. |
| < number> | Числовая константа, поддерживающая научную нотацию. |
| < jsonpath starting with $> | Значение, на которое ссылается JSONPath из корневого узла входного документа; поддерживаются только определенные пути. |
| < jsonpath starting with @> | Значение, на которое ссылается JSONPath из текущего объекта / элемента; поддерживаются только определенные пути. |
Поддерживаемые операторы:
| Оператор | Тип | Описание | Результат |
|---|---|---|---|
| - | Двоичный файл | Вычитание | Количество |
| + | Двоичный файл | Добавление | Количество |
| / | Двоичный файл | Разделение | Количество |
| * | Двоичный файл | Умножение | Количество |
| == | Двоичный файл | Равенство | Логическое значение (1/0) |
| != | Двоичный файл | Неравенство | Логическое значение (1/0) |
| < | Двоичный файл | Меньше, чем | Логическое значение (1/0) |
| <= | Двоичный файл | Меньше или равно | Логическое значение (1/0) |
| > | Двоичный файл | Больше, чем | Логическое значение (1/0) |
| >= | Двоичный файл | Больше или равно | Логическое значение (1/0) |
| =~ | Двоичный файл | Соответствует регулярному выражению | Логическое значение (1/0) |
| ! | Унарный | Логическое ЗНАЧЕНИЕ NOT | Логическое значение (1/0) |
| || | Двоичный файл | Логическое значение ИЛИ | Логическое значение (1/0) |
| && | Двоичный файл | Логическое значение И | Логическое значение (1/0) |
Функции
В конце JSONPath можно использовать функции. Если предыдущая функция возвращает значение, которое принимает следующая функция, то несколько функций можно объединить в цепочку.
Поддерживаемые функции:
| Функция | Описание | Ввод | Вывод |
|---|---|---|---|
| avg | Среднее значение чисел во входном массиве | Массив чисел | Количество |
| min | Минимальное значение чисел во входном массиве | Массив чисел | Количество |
| max | Максимальное значение чисел во входном массиве | Массив чисел | Количество |
| sum | Сумма чисел во входном массиве | Массив чисел | Количество |
| length | Количество элементов во входном массиве | Массив | Количество |
| first | Первый элемент массива | Массив | Конструкция JSON в зависимости от содержимого входного массива |
Агрегатные функции в JSONPath работают с числовыми значениями, которые заключены в кавычки. При необходимости агрегации эти значения автоматически преобразуются из строк в числа. Если входные данные несовместимы, функция выдаст ошибку.
Результат
В JSONPath есть два типа путей: определённые и неопределённые.
Определённый путь может вернуть либо null, либо единственный результат совпадения. Неопределённый путь может вернуть несколько результатов совпадений: JSONPaths с разделёнными, несколькими списками имён/индексов, фрагментами массива или сегментами выражения.
Если в JSONPath используется функция, путь становится определённым, так как функции всегда возвращают одно значение.
Определённый путь возвращает объект, массив или значение, на которое он указывает. В отличие от него, неопределённый путь возвращает массив соответствующих объектов, массивов или значений.
Форматирование
В сегментах, обозначенных скобками, и в выражениях можно использовать пробелы (пробел, символ табуляции). Например:
$[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first()
Строки необходимо заключать в одинарные (') или двойные (") кавычки. Если внутри строки используются такие же кавычки, как и для её заключения, их нужно экранировать с помощью символа обратной косой черты (). То же самое касается и обратной косой черты (), которая также должна экранироваться символом обратной косой черты ().
Пример кода
В этом примере мы создаем словарь dictData, содержащий информацию о пользователе, а затем используем метод json.dumps для его кодирования в формат JSON. Метод dumps преобразует словарь в строку JSON, которую можно сохранить в файл или передать по сети.
import json
# Загрузка JSON из строки
jsonData = """
{
"ID": 310450,
"login": "admin",
"name": "James Bond",
"password": "root",
"phone": 3330303,
"email": "jamesbond@example.com",
"online": true
}
"""
# Декодирование JSON в словарь
dictData = json.loads(jsonData)
print(dictData["name"])
print(dictData["phone"])
print(dictData["email"])
print(dictData["online"])