Блог

Руководство по JSONPath: извлечение данных из сложного JSON

Порой нужно извлечь конкретные значения из ответов API или больших наборов данных JSON. Вместо того чтобы вручную перебирать всю структуру данных, JSONPath позволяет точно находить и извлекать нужные данные. Это руководство охватывает синтаксис JSONPath и практические шаблоны использования.

Что такое JSONPath?

JSONPath — это язык запросов для выборки конкретных элементов из данных JSON. Вдохновлённый XPath для XML, он обеспечивает эффективное извлечение данных из сложных структур JSON.

Базовый синтаксис

В качестве примера будем использовать следующие данные JSON:

{
"store": {
"books": [
{
"title": "Clean Code",
"author": "Robert C. Martin",
"price": 35.99,
"tags": ["programming", "best-practices"]
},
{
"title": "The Pragmatic Programmer",
"author": "David Thomas",
"price": 49.99,
"tags": ["programming", "career"]
},
{
"title": "Design Patterns",
"author": "Gang of Four",
"price": 54.99,
"tags": ["programming", "architecture"]
}
],
"location": "online"
}
}

Корневой элемент: $

Каждое выражение JSONPath начинается с $ (корень).

ВыражениеРезультат
$Весь JSON-документ
$.storeПолный объект store
$.store.location"online"

Точечная нотация vs нотация с квадратными скобками

$.store.books[0].title → Точечная нотация
$['store']['books'][0]['title'] → Нотация с квадратными скобками

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

Обращение к массивам

ВыражениеОписание
$.store.books[0]Первая книга
$.store.books[-1]Последняя книга
$.store.books[0,2]Первая и третья книги
$.store.books[0:2]Индексы 0–1 (срез)

Подстановочные знаки и рекурсивный спуск

Подстановочный знак: *

Выбирает все элементы.

$.store.books[*].title
→ ["Clean Code", "The Pragmatic Programmer", "Design Patterns"]
$.store.books[*].price
→ [35.99, 49.99, 54.99]

Рекурсивный спуск: ..

Выполняет поиск на всех уровнях вложенности.

$..title
→ ["Clean Code", "The Pragmatic Programmer", "Design Patterns"]
$..price
→ [35.99, 49.99, 54.99]

Рекурсивный спуск полезен, когда глубина вложенности неизвестна, но при работе с большими наборами данных следует учитывать влияние на производительность.

Фильтрующие выражения

Для условной выборки используется синтаксис ?().

Операторы сравнения

$.store.books[?(@.price > 40)]
→ Книги дороже 40
$.store.books[?(@.price < 50)]
→ Книги дешевле 50
$.store.books[?(@.author == "David Thomas")]
→ Книги автора "David Thomas"

Здесь @ ссылается на текущий элемент.

Логические операторы

$.store.books[?(@.price > 40 && @.price < 55)]
→ Книги ценой от 40 до 55

Практические примеры

Извлечение конкретных полей из ответов API

Извлечь только адреса электронной почты из API списка пользователей:

$.users[*].email

Поиск значений во вложенных объектах

Извлечь все номера портов из конфигурационного файла:

$..port

Условная фильтрация данных

Извлечь только активных пользователей:

$.users[?(@.status == "active")]

Выбор диапазонов массивов

Последние 10 записей журнала:

$.logs[-10:]

JSONPath vs JavaScript

ЗадачаJavaScriptJSONPath
Название первой книгиdata.store.books[0].title$.store.books[0].title
Все ценыdata.store.books.map(b => b.price)$.store.books[*].price
Фильтр по ценеdata.store.books.filter(b => b.price > 40)$.store.books[?(@.price > 40)]
Все названия (рекурсивно)Требуется рекурсивная функция$..title

JSONPath извлекает данные декларативно, без написания кода, что делает его особенно полезным для отладки и исследования данных.

Советы и предостережения

  1. Тестируйте свои пути: проверяйте сложные выражения JSONPath в реальном времени с помощью инструмента Query в JSONKit.
  2. Производительность: .. (рекурсивный спуск) может работать медленно на большом JSON. По возможности используйте явные пути.
  3. Различия в реализациях: синтаксис JSONPath может немного различаться в разных реализациях. JSONKit использует библиотеку jsonpath-plus.
  4. Тип результата: результаты JSONPath всегда возвращаются в виде массивов. Даже когда ожидается одно значение, его нужно извлечь из массива.

Заключение

Освоение JSONPath позволяет быстро и точно извлекать данные из сложных структур JSON. Используйте инструмент JSONPath Query в JSONKit для тестирования запросов в реальном времени и мгновенного просмотра результатов.