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:]