Що таке JSONPath?
JSONPath — це мова запитів для JSON-документів, JSON-еквівалент XPath для XML. Стефан Гессnер запропонував її у 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-навантаження без написання рекурсивного спуску вручну:
- Тести 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для розгалуження задач над масивом. 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.
Який діалект використовує цей тестер?
Цей тестер запускає jsonpath-plus 9.x. Ця бібліотека реалізує специфікацію Гесснера 2007 року, охоплює більшість RFC 9535 і додає розширені оператори, такі як перевірки типів (@.string(), @.number(), @.boolean()) та навігація до батьківського елемента (^).
Прапорець preventEval: true завжди встановлений, тому предикати фільтрів виконуються через безпечний інтерпретатор, а не через вбудований JavaScript eval(). Вставлений запит не може виконати довільний код проти цієї сторінки.
Чи можна скопіювати окремі знайдені значення?
Так. Кнопка Копіювати в буфер копіює повний блок результатів як JSON-масив. Щоб взяти одне значення, перемкніть режим виводу на Значення, потім виберіть потрібний рядок у текстовій області результатів і скористайтеся звичайним ярликом копіювання браузера (Ctrl/Cmd + C).
Вивід є простим текстом JSON, тому він чисто вставляється у редактор коду, термінал, тест Postman або повідомлення у Slack.