Руководство по запросам JSONPath: Точное извлечение вложенных данных из JSON
Что такое JSONPath
JSONPath — это язык запросов к JSON, подобный XPath для XML, который точно извлекает данные из сложного вложенного JSON:
{
"store": {
"books": [
{"title": "The Three-Body Problem", "price": 68},
{"title": "To Live", "price": 45},
{"title": "One Hundred Years of Solitude", "price": 55}
]
}
}
Используйте $.store.books[*].title, чтобы извлечь все заголовки: ["The Three-Body Problem", "To Live", "One Hundred Years of Solitude"]
Справка по базовому синтаксису
| Синтаксис | Значение | Пример |
|---|---|---|
$ |
Корневой узел | $ |
. |
Дочерний узел | $.store |
[] |
Индекс массива или дочерний узел | $[0], $['key'] |
* |
Подстановочный знак, все элементы | $.store.* |
.. |
Рекурсивный спуск, все уровни | $..title |
[start:end] |
Срез массива | $[0:2] |
[?(expr)] |
Выражение фильтра | $[?(@.price > 50)] |
Подробное объяснение синтаксиса
Корневой узел $
$ представляет корень JSON. Все пути начинаются с $:
$ → Весь JSON
$.store → Объект store
Доступ к дочерним узлам .
Используйте . или [] для доступа к дочерним узлам:
$.store.books → Массив books
$.store['books'] → Эквивалентная форма; требуется, когда имена ключей содержат спецсимволы
Индекс массива []
$.store.books[0] → Первая книга
$.store.books[-1] → Последняя книга
$.store.books[0:2] → Первые две книги (срез)
Подстановочный знак *
$.store.books[*] → Все книги
$.store.books[*].title → Все заголовки
Рекурсивный спуск ..
.. ищет на всех уровнях без указания полного пути:
$..title → Все поля title на любом уровне
$..price → Все поля price на любом уровне
..особенно полезен в глубоко вложенных ответах API.
Выражения фильтра ?()
Фильтрация — самая мощная возможность JSONPath:
Операторы сравнения
| Оператор | Значение | Пример |
|---|---|---|
== |
Равно | $[?(@.price == 45)] |
!= |
Не равно | $[?(@.price != 45)] |
> |
Больше | $[?(@.price > 50)] |
< |
Меньше | $[?(@.price < 50)] |
>= |
Больше или равно | $[?(@.price >= 55)] |
Логические операторы
$[?(@.price > 50 && @.price < 70)] → Цена от 50 до 70
$[?(@.category == 'fiction' || @.price < 40)] → Фантастика или цена ниже 40
Сопоставление строк
$[?(@.title =~ /Three.*/)] → Заголовок, начинающийся с «Three»
Использование инструмента JSONPath
Шаг 1: Открыть инструмент
Перейдите к инструменту JSONPath, чтобы войти в интерфейс запросов.
Шаг 2: Ввести данные JSON
Вставьте ответ API или данные JSON в поле ввода. Вы можете предварительно отформатировать их с помощью Форматера JSON.
Шаг 3: Написать выражение JSONPath
Введите выражение в поле запроса, напр. $.data.users[*].name.
Шаг 4: Просмотр результатов извлечения
Инструмент отображает совпадающие результаты в реальном времени и подсвечивает найденные узлы в исходных данных.
Практика: Извлечение данных из ответов API
Пример GitHub API
{
"items": [
{"full_name": "vuejs/vue", "stargazers_count": 45000, "language": "TypeScript"},
{"full_name": "facebook/react", "stargazers_count": 42000, "language": "JavaScript"}
]
}
$.items[*].full_name → Все названия репозиториев
$.items[?(@.stargazers_count > 43000)].full_name → Названия репо со Stars > 43000
Извлечение постраничных данных
$.data.list[*].id → Все ID на текущей странице
$.pagination.next_cursor → Курсор следующей страницы
JSONPath vs JMESPath
| Сравнение | JSONPath | JMESPath |
|---|---|---|
| Стиль синтаксиса | Подобен XPath | Подобен SQL/pipe |
| Рекурсивный поиск | .. поддерживается нативно |
Требует явного обхода |
| Синтаксис фильтра | [?(@.x > 1)] |
[?x > 1] |
| Проекция/трансформация | Не поддерживается | Поддерживает [*].{n: name} |
| Сортировка множественных результатов | Не гарантируется | Может сортировать |
| Инструмент | JSONPath | JMESPath |
Используйте JSONPath для простого извлечения, JMESPath для трансформации/проекции.
Частые проблемы
| Проблема | Причина | Решение |
|---|---|---|
| Запрос возвращает пустой результат | Опечатка в пути | Проверить регистр имён ключей |
| Фильтр не работает | Различие в версии синтаксиса | Подтвердить поддерживаемую версию синтаксиса инструмента |
| Выход индекса массива за границы | Индекс превышает диапазон | Использовать [*] или проверить длину массива |
| Слишком много рекурсивных результатов | .. совпал на всех уровнях |
Сузить область или добавить условия фильтра |
| Ошибка ключа со спецсимволами | Ключ содержит . или - |
Использовать синтаксис скобок ['key.name'] |
Итоги
JSONPath — мощный инструмент для работы с данными JSON. Освойте шесть базовых элементов синтаксиса — $, ., [], *, .., ?() — и вы сможете точно извлекать данные из любого вложенного JSON. Инструмент JSONPath предоставляет запросы в реальном времени с подсветкой позиций, а JMESPath и Форматер JSON дополнят ваш рабочий процесс обработки данных JSON.