§

Тестувати JSONPath-вирази

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

JSONPath зустрічається скрізь, де потрібно перевірити API-контракт проти реального навантаження. Команди, що пишуть регресійні набори тестів у Postman, перевіряють поля відповіді за допомогою JSONPath у вкладці Tests. Скрипти k6 навантажувального тестування витягують значення з відповідей API за допомогою jsonpath() для перевірки порогових значень SLA. Виконання цих виразів у вкладці браузера утримує конфіденційні фікстури, персональні дані клієнтів та відповіді API на вашому пристрої.

Що таке JSONPath?

JSONPath — це мова запитів для JSON-документів, JSON-еквівалент XPath для XML. Стефан Гессnер запропонував її у 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-навантаження без написання рекурсивного спуску вручну:

  • Тести Postman: вкладка Tests у 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 для перетворення навантажень подій між станами. 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.

Який діалект використовує цей тестер?

Цей тестер запускає jsonpath-plus 9.x. Ця бібліотека реалізує специфікацію Гесснера 2007 року, охоплює більшість RFC 9535 і додає розширені оператори, такі як перевірки типів (@.string(), @.number(), @.boolean()) та навігація до батьківського елемента (^).

Прапорець preventEval: true завжди встановлений, тому предикати фільтрів виконуються через безпечний інтерпретатор, а не через вбудований JavaScript eval(). Вставлений запит не може виконати довільний код проти цієї сторінки.

Чи можна скопіювати окремі знайдені значення?

Так. Кнопка Копіювати в буфер копіює повний блок результатів як JSON-масив. Щоб взяти одне значення, перемкніть режим виводу на Значення, потім виберіть потрібний рядок у текстовій області результатів і скористайтеся звичайним ярликом копіювання браузера (Ctrl/Cmd + C).

Вивід є простим текстом JSON, тому він чисто вставляється у редактор коду, термінал, тест Postman або повідомлення у Slack.