Что такое JSONPath?
JSONPath — это язык запросов для JSON-документов, JSON-эквивалент XPath для XML. Стефан Гёсснер предложил его в 2007 году как короткий читаемый способ указать на узел внутри JSON-дерева без написания парсера. Выражение начинается с корневого селектора $ и объединяет обращения к свойствам, индексы массивов, подстановочные знаки, рекурсивный спуск и условия фильтрации, пока не выберет нужные узлы. В 2024 году IETF опубликовал RFC 9535 для стандартизации синтаксиса, фрагментировавшегося между реализациями; этот тестер работает на jsonpath-plus — широко используемой JavaScript-реализации, охватывающей черновик Гёсснера, большинство RFC 9535 и несколько дополнительных операторов.
Как работает JSONPath
JSONPath-выражение читается слева направо и обходит JSON-документ шаг за шагом. Каждый шаг берёт набор узлов, прошедших предыдущий шаг, и сужает его дальше. Полный пайплайн вычисления:
- Привязка к корневому селектору
$. Каждое выражение начинается здесь, указывая на значение верхнего уровня — объект или массив. Голые имена свойств без ведущего$не являются допустимым JSONPath. - Вход в дочерние члены через точечную нотацию (
$.store.book) или скобочную нотацию ($['store']['book']). Скобочная нотация обязательна, когда ключ содержит пробел, дефис или любой символ, не являющийся допустимым идентификатором. - Поиск по всем уровням сразу с помощью оператора рекурсивного спуска
... Выражение$..authorсобирает каждое значениеauthorв любом месте дерева, независимо от глубины. Это оператор, которого нет в JMESPath. - Выборка элементов массива по индексу (
[0],[-1]для последнего элемента в jsonpath-plus), срезов через нотацию[start:end]([0:3]возвращает первые три) или всех элементов через подстановочный знак[*]. - Фильтрация элементов предикатом внутри
[?(...)]. Внутри предиката@ссылается на текущий элемент, поэтому[?(@.price<10)]оставляет только элементы, у которых полеpriceменьше 10. Фильтры компонуются с остальным путём — можно фильтровать, а затем делать спуск, или делать спуск, а затем фильтровать. - Выбор формата вывода. Значения возвращают сами совпавшие данные. Пути возвращают JSONPath каждого совпадения, чтобы было видно, что движок разрешил. Указатели возвращают эквивалентный RFC 6901 JSON Pointer для каждого совпадения — полезно, когда потребитель на другом конце использует JSON Patch или валидатор JSON Schema.
Почему стоит использовать этот JSONPath-тестер?
- Ваш JSON никогда не покидает браузер. Запрос выполняется внутри страницы, поэтому продакшн-фикстуры, персональные данные клиентов и API-ответы до публичного релиза остаются на вашей машине.
- Движок — это
jsonpath-plus9.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для распределения задач по массиву. Kuberneteskubectl -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.