§

Тестирование JSONPath-выражений

Формат вывода:
Краткий справочник JSONPath
Token Meaning
$Корневой элемент документа
@Текущий элемент (используется внутри фильтровых выражений)
.Оператор дочернего члена: выбирает именованного потомка
..Рекурсивный спуск: поиск по всем потомкам
*Подстановочный знак: совпадает с любым элементом или свойством
[*]Все элементы массива
[n]Элемент массива с индексом n (нумерация с нуля)
[start:end]Срез массива от start до end (не включая end)
[?(@.x)]Фильтр: элементы, у которых существует свойство x
[?(@.x==1)]Фильтр: элементы, у которых свойство x равно 1
[(@.length-1)]Скрипт-выражение: последний элемент массива

JSONPath встречается везде, где API-контракт нужно проверить против реального payload'а. Российские fintech-команды, пишущие регрессионные наборы в Postman, используют JSONPath во вкладке «Тесты» для проверки полей ответа; скрипты нагрузочного тестирования k6 извлекают значения из тел API-ответов через jsonpath(), чтобы проверять пороги SLA внутри блоков check(). Запуск этих выражений прямо в браузере удерживает проприетарные fixture-payload'ы, персональные данные клиентов и API-ответы до публичного релиза за пределами любого стороннего сервиса.

Что такое JSONPath?

JSONPath — это язык запросов для JSON-документов, JSON-эквивалент XPath для XML. Стефан Гёсснер предложил его в 2007 году как короткий читаемый способ указать на узел внутри JSON-дерева без написания парсера. Выражение начинается с корневого селектора $ и объединяет обращения к свойствам, индексы массивов, подстановочные знаки, рекурсивный спуск и условия фильтрации, пока не выберет нужные узлы. В 2024 году IETF опубликовал RFC 9535 для стандартизации синтаксиса, фрагментировавшегося между реализациями; этот тестер работает на jsonpath-plus — широко используемой JavaScript-реализации, охватывающей черновик Гёсснера, большинство RFC 9535 и несколько дополнительных операторов.

Как работает JSONPath

JSONPath-выражение читается слева направо и обходит JSON-документ шаг за шагом. Каждый шаг берёт набор узлов, прошедших предыдущий шаг, и сужает его дальше. Полный пайплайн вычисления:

  1. Привязка к корневому селектору $. Каждое выражение начинается здесь, указывая на значение верхнего уровня — объект или массив. Голые имена свойств без ведущего $ не являются допустимым JSONPath.
  2. Вход в дочерние члены через точечную нотацию ($.store.book) или скобочную нотацию ($['store']['book']). Скобочная нотация обязательна, когда ключ содержит пробел, дефис или любой символ, не являющийся допустимым идентификатором.
  3. Поиск по всем уровням сразу с помощью оператора рекурсивного спуска ... Выражение $..author собирает каждое значение author в любом месте дерева, независимо от глубины. Это оператор, которого нет в JMESPath.
  4. Выборка элементов массива по индексу ([0], [-1] для последнего элемента в jsonpath-plus), срезов через нотацию [start:end] ([0:3] возвращает первые три) или всех элементов через подстановочный знак [*].
  5. Фильтрация элементов предикатом внутри [?(...)]. Внутри предиката @ ссылается на текущий элемент, поэтому [?(@.price<10)] оставляет только элементы, у которых поле price меньше 10. Фильтры компонуются с остальным путём — можно фильтровать, а затем делать спуск, или делать спуск, а затем фильтровать.
  6. Выбор формата вывода. Значения возвращают сами совпавшие данные. Пути возвращают JSONPath каждого совпадения, чтобы было видно, что движок разрешил. Указатели возвращают эквивалентный RFC 6901 JSON Pointer для каждого совпадения — полезно, когда потребитель на другом конце использует JSON Patch или валидатор JSON Schema.

Почему стоит использовать этот JSONPath-тестер?

  • Ваш JSON никогда не покидает браузер. Запрос выполняется внутри страницы, поэтому продакшн-фикстуры, персональные данные клиентов и API-ответы до публичного релиза остаются на вашей машине.
  • Движок — это jsonpath-plus 9.x, та же библиотека, которая лежит в основе многих продакшн-тестовых наборов и CI-проверок. Результаты, которые вы видите здесь, совпадают с теми, которые увидит ваш пайплайн сборки.
  • Три формата вывода покрывают распространённых потребителей: сырые Значения для копирования, Пути для отладки разрешения движка и RFC 6901 Указатели для рабочих процессов JSON Patch и JSON Schema.
  • Фильтровые выражения выполняются с флагом preventEval: true, поэтому вставленный запрос не может выполнить произвольный JavaScript против хост-страницы. Это важно, когда выражение пришло из сообщения в Slack, задачи Jira или буфера обмена коллеги.

Типичные применения JSONPath

JSONPath встречается везде, где код должен извлечь поле из JSON-payload'а без написания рекурсивного обхода вручную:

  • Тесты в Postman: вкладка «Тесты» в Postman открывает доступ к pm.response.json() вместе с JSONPath-доступом для проверок. Команды пишут одно выражение вроде $.data.user.email, чтобы извлечь поле из ответа и проверить его в CI.
  • Нагрузочные тесты k6: скрипты k6 вызывают jsonpath() внутри блока check() для извлечения значений из тел ответов и проверки порогов SLA. То же выражение, которое доказало контракт в Postman, может выступать проверкой в нагрузочном тесте k6.
  • JSON DSL для преобразований данных: AWS Step Functions вычисляет JSONPath внутри InputPath, ResultPath и Parameters для перестройки событийных payload'ов между состояниями. Argo Workflows использует JSONPath в withParam для распределения задач по массиву. Kubernetes kubectl -o jsonpath использует тот же синтаксис для извлечения полей из объектов кластера.

Разобранный пример

Каноническая фикстура Гёсснера — документ «книжный магазин» с четырьмя книгами, каждая из которых содержит category, author, title и price. Применительно к этой фикстуре выражение $.store.book[?(@.price<10)].title выполняется в три шага. Сначала $.store.book разрешается в массив всех четырёх книг. Затем фильтр [?(@.price<10)] оставляет только ту книгу, цена которой ниже 10 (запись по цене 8,95). Наконец, .title извлекает название этой книги. Результат — ["Sayings of the Century"]. Переключение на Пути вернёт ["$['store']['book'][0]['title']"], а Указатели["/store/book/0/title"].

Прототипируйте выражения здесь, а затем переносите их напрямую в Postman, k6, kubectl или машину состояний Step Functions. Вставьте, запросите, скопируйте. Ничего не пересекает сеть.

Что такое JSONPath?

JSONPath — это язык запросов для JSON-документов, аналогичный XPath для XML. Предложен Стефаном Гёсснером в 2007 году и стандартизирован IETF как RFC 9535 в 2024 году. Использует компактный синтаксис выражений, начинающийся с $ (корень документа), и поддерживает точечную нотацию, индексы массивов, подстановочные знаки, срезы, рекурсивный спуск (..) и фильтровые выражения ([?(...)]) для выбора узлов внутри JSON-дерева.

Чем JSONPath отличается от JMESPath или jq?

Все три запрашивают JSON, но их грамматики и цели различаются. JMESPath — это стандарт AWS CLI / SDK: строже JSONPath, без рекурсивного спуска, создан для предсказуемых проекций без побочных эффектов. jq — это полноценный Тьюринг-полный скриптовый язык, который не только запрашивает JSON, но и преобразует, агрегирует и стримит его. JSONPath занимает промежуточное положение: выразительнее JMESPath благодаря рекурсивному спуску и фильтрам, легче jq и наиболее широко поддерживается в инструментах тестирования общего назначения (Postman, Playwright, REST Assured, kubectl, Step Functions).

Какой диалект используется в этом тестере?

Этот тестер использует jsonpath-plus 9.x. Библиотека реализует спецификацию Гёсснера 2007 года, охватывает большинство RFC 9535 и добавляет операторы расширения, такие как проверки типов (@.string(), @.number(), @.boolean()) и навигацию к родителю (^). Флаг preventEval: true всегда установлен, поэтому фильтровые предикаты выполняются через безопасный интерпретатор, а не через встроенный JavaScript eval(). Вставленный запрос не может выполнить произвольный код против этой страницы.

Можно ли скопировать отдельные совпавшие значения?

Да. Кнопка Скопировать в буфер обмена копирует весь блок результатов в виде JSON-массива. Чтобы взять одно значение, переключите режим вывода на Значения, выберите нужную строку в текстовом поле результата и воспользуйтесь стандартным сочетанием копирования браузера (Ctrl/Cmd + C). Вывод — это обычный JSON-текст, который чисто вставляется в редактор кода, терминал, тест Postman или сообщение в Slack.