Utilia

Tester JSONPath

Testuj wyrażenia JSONPath na własnym JSON w przeglądarce. Filtry, wycinki, zejście rekurencyjne, ścieżki i JSON Pointery, z gotowymi przykładami.

Jak przetestować wyrażenie JSONPath

  1. Wklej JSON w pole Dane JSON albo kliknij Wczytaj przykładowe dane, aby użyć klasycznego przykładu księgarni.
  2. Wpisz wyrażenie w polu Wyrażenie JSONPath albo wybierz je z listy Przykłady.
  3. Wynik aktualizuje się podczas pisania; Uruchom zapytanie uruchamia je ponownie. Wiersz stanu podaje liczbę dopasowań.
  4. Przełącznikiem Pokaż wybierz Wartości, Ścieżki, JSON Pointery lub Ścieżki i wartości, a potem skopiuj wynik.

Składnia JSONPath w pigułce

Składnia Znaczenie Przykład
$ korzeń dokumentu $
.name lub ['name'] element podrzędny $.store.bicycle
* każdy element podrzędny $.store.*
.. zejście rekurencyjne, na dowolnej głębokości $..author
[n] indeks tablicy, od 0 $..book[2]
[start:end:step] wycinek; liczby ujemne liczą od końca $..book[-1:]
[a,b] suma (union) $..book[0,1]
[?(expr)] filtr $..book[?(@.price < 10)]
^ rodzic każdego dopasowania $..book[?(@.price > 20)]^
~ nazwa właściwości zamiast wartości $.store.*~

Wyniki są zwracane w kolejności występowania w dokumencie. Ścieżki dają znormalizowane ścieżki, np. $['store']['book'][0]['title'], a JSON Pointery – postać z RFC 6901 /store/book/0/title, przydatną w JSON Patch czy przy ścieżkach błędów walidatorów JSON Schema.

Wyrażenia filtrujące: co jest obsługiwane

Filtry są obliczane przez jsonpath-plus w trybie bezpiecznym: wyrażenie jest parsowane i interpretowane przez mały ewaluator, a nigdy nie trafia do eval ani new Function. Wewnątrz [?( … )] możesz używać:

  • @ dla bieżącego elementu, @.field i @['field'] dla jego składowych, @root dla całego dokumentu ($ nie jest dostępne wewnątrz filtra);
  • porównań ==, !=, ===, !==, <, <=, >, >=;
  • logiki &&, ||, !, arytmetyki + - * / % i operatora warunkowego a ? b : c;
  • literałów: ciągów, liczb, true, false, null i wyrażeń regularnych;
  • metod samych wartości, np. @.title.startsWith('S'), @.tags.includes('new') czy @.title.match(/lord/i);
  • @property (klucz lub indeks bieżącego elementu), @parent i @path (jego znormalizowana ścieżka), w stylu jsonpath-plus.

Dostęp do constructor, __proto__ i konstruktora Function jest zablokowany. Jeśli filtr zawiedzie dla jednego elementu, np. @.isbn.startsWith('0') dla książki bez isbn, ten element po prostu nie pasuje; błąd składni w wyrażeniu jest zgłaszany. Filtry zapisane w stylu RFC 9535, [?@.price < 10] bez nawiasów, są akceptowane i odczytywane jako [?(@.price < 10)]. Funkcje RFC 9535, takie jak length(), count(), match() i search(), nie są dostępne: używaj zamiast nich metod JavaScriptu, np. @.name.length.

Selektory typów z jsonpath-plus działają też na końcu ścieżki: $..*@number() zwraca każdą liczbę, a @string(), @boolean(), @array(), @object(), @null() i @integer() robią to samo dla innych typów.

Najczęściej zadawane pytania

Czy mój JSON jest wysyłany na serwer?

Nie. Parsowanie i obliczanie odbywają się w twojej przeglądarce, a twoje dane nigdy nie opuszczają twojego komputera.

Dlaczego mój filtr nic nie zwraca?

Sprawdź, czy ścieżka przed filtrem wybiera tablicę lub obiekt: $.store.book[?(@.price < 10)] filtruje książki, a $.store[?(@.price < 10)] sprawdza book i bicycle. Właściwość, której brakuje w elemencie, ma wartość undefined, więc porównania z nią są fałszywe.

Czym różni się `==` od `===`?

Tak jak w JavaScripcie: == konwertuje typy ("10" == 10 jest prawdą), a === porównuje typ i wartość.

Dlaczego wynik jest ograniczony?

Do wyniku trafia tylko pierwszych 10 000 dopasowań, aby strona pozostała responsywna; wiersz stanu podaje pełną liczbę.

Czy JSONPath jest ustandaryzowany?

Tak, od 2024 roku – przez RFC 9535. Implementacje wciąż się różnią, zwłaszcza w filtrach; to narzędzie stosuje jsonpath-plus, czyli składnię oryginalnego JSONPath Stefana Goessnera.