Что представляет собой 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"])