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 на Стефан Гьоснер.