JSONPath
pip install jsonpath-rw import json from jsonpath_rw import jsonpath, parse # Парсинг JSON-строки и сохранение результата в виде Python-объекта data = json.loads('{"store":{"book":[{"title":"The Alchemist","price":8.95}]}}') # Создание JSONPath-выражения для извлечения значений ключа "title" expression = parse('$.store.book[*].title') # Извлечение значений с помощью JSONPath-выражения titles = [match.value for match in expression.find(data)] print(titles) # ['The Alchemist']
JSONPath - это специальный язык запросов, который позволяет выбирать отдельные элементы из JSON-структуры по определенным критериям. Он похож на XPath, который используется для извлечения данных из XML-документов.
Чтобы использовать JSONPath Online Evaluator, нужно следующее:
- Перейдите на сайт, на котором размещен инструмент. В поисковой строке введите "JSONPath Online Evaluator" и нажмите Enter.
- В поле "Input" введите JSON-документ, который Вы хотите анализировать. Это может быть любая JSON-структура, например:
{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } }, "expensive": 10 }
Например, чтобы выбрать все книги с категорией "fiction", можно использовать следующий запрос:
$.store.book[?(@.category == 'fiction')]
В этом JSONPath-запросе используется фильтрующее выражение [?(@.category == 'fiction')]
, которое выбирает только те книги, у которых поле "category" равно "fiction".
Общий синтаксис фильтрующего выражения такой:
[?(<условие>)]
Где условие - это логическое выражение, которое возвращает true или false. Если условие верно, то элемент включается в результат, иначе он исключается.
В нашем случае условием является @.category == 'fiction'
, которое сравнивает значение поля "category" со строкой "fiction". Оператор @
указывает на текущий элемент (в данном случае - книгу), а оператор ==
сравнивает два значения на равенство. Если значение поля "category" равно "fiction", то условие верно и элемент включается в результат.
- Специальный символ
$
указывает на корневой элемент документа. Например, чтобы выбрать весь документ, можно использовать запрос$
. - Символ
@
указывает на текущий элемент. Например, чтобы выбрать все значения поля "title", можно использовать запрос$.store.book[*].title
. - Символ
*
означает "все элементы". Например, чтобы выбрать все книги, можно использовать запрос$.store.book[*]
. - Символ
..
означает "рекурсивно все элементы". Например, чтобы выбрать все элементы во всех вложенных объектах, можно использовать запрос$..*
. - Фильтрующие выражения могут быть использованы для выборки элементов с определенными свойствами. Фильтрующие выражения выглядят так:
[?(<условие>)]
, где условие - это логическое выражение
- Символ
[<индекс>]
позволяет выбирать элемент по его индексу в массиве. Например, чтобы выбрать вторую книгу, можно использовать запрос$.store.book[1]
. - Символ
[<start>:<end>]
позволяет выбирать срез элементов массива. Например, чтобы выбрать вторую и третью книгу, можно использовать запрос$.store.book[1:3]
. - Символ
[-<n>]
позволяет выбирать последние n элементов массива. Например, чтобы выбрать последние две книги, можно использовать запрос$.store.book[-2:]
.
Помимо этих символов, JSONPath также поддерживает различные функции, которые можно использовать для обработки данных. Например, функция length()
возвращает количество элементов в массиве.
- Выбрать все книги, у которых поле "category" равно "fiction":
$.store.book[?(@.category == 'fiction')]
- Выбрать названия всех книг:
$.store.book[*].title
- Выбрать все цены книг:
$..price
- Выбрать первую книгу:
$.store.book[0]
- Выбрать последнюю книгу:
$.store.book[-1:]
- Выбрать вторую и третью книгу:
$.store.book[1:3]
- Выбрать все книги, у которых указан идентификатор ISBN:
$.store.book[?(@.isbn)]
- Выбрать все авторы книг:
$..author
- Выбрать все элементы во всех вложенных объектах:
$..*
- Выбрать количество книг:
length($.store.book)
Чтобы совместить оба примера запроса JSONPath, нужно объединить условия фильтрации с помощью логического оператора AND
(&&
). Получится следующий запрос:
$.store.book[?(@.price < 10 && (@.category == 'reference' || @.category == 'fiction'))]
Этот запрос выберет все книги, у которых цена меньше 10 долларов и категория равна "reference" или "fiction".
Обратите внимание, что условие @.category == 'reference' || @.category == 'fiction'
нужно обернуть в скобки, так как это объединение двух условий с помощью логического оператора OR
.
- Выбрать весь документ:
$
- Выбрать все значения поля "name":
$.name
- Выбрать все элементы массива:
$.array[*]
- Выбрать первый элемент массива:
$.array[0]
- Выбрать все элементы массива, у которых поле "enabled" равно true:
$.array[?(@.enabled)]
- Выбрать все элементы массива с четным индексом: `$.array[0,2,4,6,8]
- Выбрать все элементы массива с нечетным индексом:
$.array[1,3,5,7,9]
- Выбрать второй и третий элементы массива:
$.array[1:3]
- Выбрать последний элемент массива:
$.array[-1:]
- Выбрать все элементы массива, у которых поле "type" равно "primary" или "secondary":
$.array[?(@.type == 'primary' || @.type == 'secondary')]
- Выбрать все элементы массива, у которых поле "type" равно "primary" и поле "enabled" равно true:
$.array[?(@.type == 'primary' && @.enabled)]
- Выбрать все значения поля "name" у элементов массива:
$.array[*].name
- Выбрать все значения поля "value" во всех вложенных объектах:
$..value
- Выбрать все элементы массива, у которых поле "name" содержит строку "item":
$.array[?(@.name.contains('item'))]
- Выбрать количество элементов массива:
length($.array)
- Выбрать все элементы массива, у которых поле "name" начинается со строки "item":
$.array[?(@.name.startsWith('item'))]
- Выбрать все элементы массива, у которых поле "name" заканчивается строкой "item":
$.array[?(@.name.endsWith('item'))]
- Выбрать все элементы массива, у которых поле "value" является числом:
$.array[?(@.value.isNumber())]
- Выбрать все элементы массива, у которых поле "value" является строкой:
$.array[?(@.value.isString())]
- Выбрать все элементы массива, у которых поле "value" является логическим значением:
$.array[?(@.value.isBoolean())]
- Выбрать все элементы массива, у которых поле "value" является массивом:
$.array[?(@.value.isArray())]
- Выбрать все элементы массива, у которых поле "value" является объектом:
$.array[?(@.value.isObject())]
- Выбрать все элементы массива, у которых поле "value" является null:
$.array[?(@.value.isNull())]
- Выбрать первый элемент массива с помощью функции head():
$.array[0]
- Выбрать все элементы массива, кроме первого с помощью функции tail():
$.array[1:]