Utilia

Тестер JSONPath

Перевіряйте вирази JSONPath на власному JSON у браузері. Фільтри, зрізи, рекурсивний спуск, шляхи та JSON Pointer, з готовими прикладами.

Як перевірити вираз JSONPath

  1. Вставте свій JSON у поле Дані JSON або натисніть Завантажити зразок даних, щоб скористатися класичним прикладом книгарні.
  2. Введіть вираз у полі Вираз JSONPath або виберіть його зі списку Приклади.
  3. Результат оновлюється під час введення; кнопка Виконати запит запускає його знову. Рядок стану показує кількість збігів.
  4. За допомогою Показувати перемикайтеся між Значення, Шляхи, JSON Pointer і Шляхи й значення, а потім скопіюйте результат.

Синтаксис JSONPath коротко

Синтаксис Значення Приклад
$ корінь документа $
.name або ['name'] дочірній елемент $.store.bicycle
* кожен дочірній елемент $.store.*
.. рекурсивний спуск, на будь-якій глибині $..author
[n] індекс масиву, від 0 $..book[2]
[start:end:step] зріз; від’ємні числа відлічуються з кінця $..book[-1:]
[a,b] об’єднання $..book[0,1]
[?(expr)] фільтр $..book[?(@.price < 10)]
^ батьківський елемент кожного збігу $..book[?(@.price > 20)]^
~ назва властивості замість значення $.store.*~

Результати повертаються в порядку документа. Варіант Шляхи дає нормалізовані шляхи на кшталт $['store']['book'][0]['title'], а JSON Pointer – форму з RFC 6901 /store/book/0/title, зручну для JSON Patch або для шляхів помилок у валідаторів JSON Schema.

Вирази фільтрів: що підтримується

Фільтри обчислюються за допомогою jsonpath-plus у безпечному режимі: вираз розбирає й інтерпретує невеликий обчислювач, і він ніколи не передається в eval чи new Function. Усередині [?( … )] можна використовувати:

  • @ для поточного елемента, @.field та @['field'] для його членів, @root для всього документа ($ усередині фільтра недоступний);
  • порівняння ==, !=, ===, !==, <, <=, >, >=;
  • логіку &&, ||, !, арифметику + - * / % і тернарний оператор a ? b : c;
  • літерали рядків, чисел, true, false, null і регулярних виразів;
  • методи самих значень, наприклад @.title.startsWith('S'), @.tags.includes('new') або @.title.match(/lord/i);
  • @property (ключ чи індекс поточного елемента), @parent і @path (його нормалізований шлях) у стилі jsonpath-plus.

Доступ до constructor, __proto__ та конструктора Function заблоковано. Якщо фільтр завершується помилкою для одного елемента, наприклад @.isbn.startsWith('0') для книги без isbn, цей елемент просто не збігається; синтаксична помилка у виразі повідомляється. Фільтри, записані за RFC 9535, [?@.price < 10] без дужок, приймаються й читаються як [?(@.price < 10)]. Функції RFC 9535, як-от length(), count(), match() і search(), недоступні: користуйтеся методами JavaScript, наприклад @.name.length.

Селектори типів із jsonpath-plus також працюють наприкінці шляху: $..*@number() повертає кожне число, а @string(), @boolean(), @array(), @object(), @null() та @integer() роблять те саме для інших типів.

Поширені запитання

Чи надсилається мій JSON на сервер?

Ні. Розбір і обчислення відбуваються у вашому браузері, а ваші дані ніколи не залишають ваш комп’ютер.

Чому мій фільтр нічого не повертає?

Перевірте, що шлях перед фільтром вибирає масив або об’єкт: $.store.book[?(@.price < 10)] фільтрує книги, а $.store[?(@.price < 10)] розглядає book і bicycle. Властивість, якої бракує в елементі, є undefined, тож порівняння з нею хибні.

Чим відрізняються `==` і `===`?

Як і в JavaScript, == перетворює типи ("10" == 10 – істина), а === порівнює тип і значення.

Чому вивід обмежено?

До результату записуються лише перші 10 000 збігів, щоб сторінка лишалася чуйною; рядок стану показує повну кількість.

Чи стандартизовано JSONPath?

Так, з 2024 року, у RFC 9535. Реалізації все ще відрізняються, особливо у фільтрах; цей інструмент дотримується jsonpath-plus – синтаксису оригінального JSONPath Стефана Ґьоснера.