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

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.

#JSONPath#数据查询#嵌套#过滤#提取