Skip to content

Darmowy tester JSONPath — wyrażenia online

Testuj wyrażenia JSONPath na dowolnym JSON-ie błyskawicznie. Silnik RFC 9535 i tryb Classic (Goessner), widoki Wartości / Ścieżki / Oba, ścieżki znormalizowane, bez eval. W 100% prywatnie, w przeglądarce, bez wysyłania.

Bez śledzenia Działa w przeglądarce Bezpłatne
Cała ewaluacja działa lokalnie w twojej przeglądarce. Twój JSON i wyrażenie nigdy nie opuszczają tego urządzenia. Bez eval, bez wysyłania.
Silnik
 
Ściąga JSONPath
$Element korzenia
@Bieżący element (w filtrach)
.nameSkładnik podrzędny
..nameRekurencyjne zejście
[*]Wszystkie elementy / składniki
[0]Indeks tablicy
[0:2]Wycinek tablicy [start:end:step]
[a,b]Unia nazw / indeksów
[?(@.k>1)]Wyrażenie filtrujące
length()Funkcja RFC 9535: length / count / match / search / value
Sprawdzono pod kątem wierności gramatyce RFC 9535, poprawności ścieżek znormalizowanych, parzystości semantycznej dwóch silników na typowych ścieżkach i udokumentowanej rozbieżności w przypadkach brzegowych, bezpieczeństwa braku eval (zamykając CVE-2024-21534 i CVE-2025-1302) oraz dostępności (role ARIA, przełącznik silnika typu radiogroup, ogłaszanie wyników przez czytniki ekranu, obsługa JSON w układzie LTR pod układami RTL). — Zespół Narzędzi Danych Go Tools · Jun 13, 2026

Czym jest tester JSONPath?

Tester JSONPath to narzędzie, które pozwala napisać wyrażenie JSONPath, wkleić dokument JSON i zobaczyć dokładnie, które węzły wyrażenie wybiera — zarówno dopasowane wartości, jak i ich precyzyjne lokalizacje — bez pisania kodu czy uruchamiania skryptu. Dla programistów skraca pętlę z minut do milisekund: dostrój ścieżkę, obserwuj zmianę wyniku i wyślij zapytanie z pewnością.

JSONPath to język zapytań dla JSON-a, odpowiednik XPath dla XML-a w świecie JSON. Wyrażenie buduje się z małego alfabetu selektorów. $ to korzeń dokumentu. Kropka lub nawias wkracza w dziecko: $.store lub $['store']. Podwójna kropka .. to rekurencyjne zejście — przeszukuje każdy poziom drzewa. Symbol wieloznaczny * wybiera wszystkie elementy lub składniki. Nawiasy niosą indeksy tablic ([0]), wycinki ([start:end:step]), unie ([a,b]) i wyrażenia filtrujące ([?(@.price < 10)], gdzie @ to testowany element). Z tych kawałków możesz wyciągnąć pojedyncze pole z głęboko zagnieżdżonej odpowiedzi API, asercjonować wartości w testach, sterować przekształceniami danych w systemach takich jak Kubernetes, AWS Step Functions i Azure Logic Apps lub ekstrahować ustrukturyzowane dane z nieregularnego JSON-a — wszystko bez imperatywnego kodu przechodzenia. JSONPath jest też słynnie niespójny między implementacjami, co jest dokładnie tym problemem, który dobry tester ujawnia, zanim trafi on na produkcję.

Ten tester dostarcza dwa silniki. Domyślny to silnik RFC 9535: RFC 9535 to formalna specyfikacja JSONPath autorstwa IETF z lutego 2024 roku, pierwszy raz, gdy język został precyzyjnie ustandaryzowany po piętnastu latach rozbieżnych implementacji. Definiuje on dokładną gramatykę, koncepcję ścieżek znormalizowanych dla wyników oraz pięć standardowych funkcji — length(), count(), match(), search(), value(). Nasz silnik RFC 9535 to implementacja bez zależności, która nie używa eval, więc parsuje i interpretuje wyrażenia własną gramatyką, zamiast kompilować je do JavaScriptu. Drugi silnik to Classic (Goessner), faktyczny dialekt z 2007 roku, który implementuje większość starszych narzędzi i bibliotek online; przełącz się na niego, aby odtworzyć wyniki z narzędzia takiego jak jsonpath.com lub uruchomić wyrażenie skopiowane ze starszego kodu. Oba dialekty zgadzają się co do typowych ścieżek, ale rozchodzą się w przypadkach brzegowych — białe znaki i cudzysłowy w filtrach, kolejność unii, sposób porównywania brakujących składników oraz to, jakie funkcje istnieją — więc możliwość przełączania się między nimi w jednym miejscu to najszybszy sposób na zdiagnozowanie, dlaczego wyrażenie zachowuje się inaczej, niż oczekiwałeś.

Co tester ujawnia poza surowymi wartościami: wynikiem zapytania JSONPath jest lista węzłów, a to narzędzie może pokazać ją na trzy sposoby. Widok Wartości renderuje dopasowane węzły jako tablicę JSON, dokładnie to, co skonsumowałbyś w kodzie. Widok Ścieżki renderuje ścieżkę znormalizowaną każdego dopasowania — kanoniczną lokalizację w nawiasach z cudzysłowami, taką jak $['store']['book'][0]['title'], która jednoznacznie identyfikuje, gdzie w dokumencie znajduje się wartość, bez względu na to, jak napisano wyrażenie. Dwa wyrażenia, które wybierają ten sam węzeł, produkują tę samą ścieżkę znormalizowaną, co czyni widok Ścieżki nieocenionym przy debugowaniu. Widok Oba pokazuje wartości i ścieżki obok siebie. Wiersz statystyk raportuje, ile węzłów się dopasowało.

Bezpieczeństwo jest tu sprawą pierwszorzędną. Wiele ewaluatorów JSONPath online działa na serwerze lub osadza bibliotekę, która ewaluuje predykaty filtrów za pomocą javascriptowego eval — projekt, który wyprodukował podatności na zdalne wykonanie kodu śledzone jako CVE-2024-21534 i CVE-2025-1302 w szeroko używanych pakietach JSONPath. To narzędzie nie używa żadnego eval. Silnik RFC 9535 nie ma ścieżki eval, a silnik Classic jest zbudowany na załatanym, przypiętym wydaniu jsonpath-plus z jawnie wyłączonym eval. To zamyka klasę błędów RCE i pozwala narzędziu działać pod ścisłą Content-Security-Policy, która zabrania unsafe-eval. Każda ewaluacja jest lokalna: twój JSON i twoje wyrażenie nigdy nie opuszczają strony, nigdy nie są rejestrowane i nigdy nie są zapisywane na dysku — tylko twoje preferencje silnika i widoku utrwalają się do localStorage. To czyni narzędzie bezpiecznym dla zastrzeżonych ładunków API, zredagowanych logów, wewnętrznej konfiguracji i wszelkich danych ze schematem, którego nie wkleiłbyś do usługi opartej na serwerze.

Jeśli twoim zadaniem jest praca z JSON-em, sparuj to z innymi narzędziami JSON na stronie: sformatuj i ładnie wyświetl wejście za pomocą Formatowania JSON, porównaj dwa dokumenty za pomocą JSON Diff, sprawdź ładunek względem schematu za pomocą Walidatora schematu JSON lub zamień przykładową odpowiedź na typowane interfejsy za pomocą JSON to TypeScript.

// The expression you build in this tester maps straight onto the
// RFC 9535 reference library used under the hood.
import { query, paths } from 'jsonpath-rfc9535';

const document = {
  store: {
    book: [
      { title: 'Sayings of the Century', author: 'Nigel Rees', price: 8.95 },
      { title: 'Sword of Honour', author: 'Evelyn Waugh', price: 12.99 },
      { title: 'Moby Dick', author: 'Herman Melville', price: 8.99 },
      { title: 'The Lord of the Rings', author: 'J. R. R. Tolkien', price: 22.99 }
    ]
  }
};

// Values: query(document, path) returns the matched values directly.
const titles = query(document, '$.store.book[*].title');
// → ['Sayings of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']

// Filter: books cheaper than 10.
const cheap = query(document, '$.store.book[?(@.price < 10)].title');
// → ['Sayings of the Century', 'Moby Dick']

// Normalized paths: paths(document, path) returns where each match lives.
const authorPaths = paths(document, '$..author');
// → ["$['store']['book'][0]['author']", "$['store']['book'][1]['author']", ...]

// RFC 9535 functions like length() are used INSIDE filters, not as a segment.
const longTitles = query(document, '$.store.book[?length(@.title) > 15]');
// → the two books whose title is longer than 15 characters

Kluczowe funkcje

Standardowy silnik RFC 9535 (bez eval)

Domyślny silnik implementuje RFC 9535, formalną specyfikację JSONPath autorstwa IETF z 2024 roku — dokładną gramatykę, ścieżki znormalizowane i pięć standardowych funkcji. Jest bez zależności i nie używa eval, więc parsuje i interpretuje wyrażenia własną gramatyką, zamiast kompilować je do JavaScriptu. Działa pod ścisłą Content-Security-Policy.

Tryb zgodności Classic (Goessner)

Jeden przełącznik zmienia na silnik zgodny z Goessnerem (zbudowany na jsonpath-plus, skonstruowany z wyłączonym eval), dzięki czemu wyrażenia skopiowane ze starszych narzędzi, takich jak jsonpath.com, zachowują się tak, jak je tam widziałeś. Przełączaj między RFC 9535 a Classic, aby porównywać wyniki i diagnozować, dlaczego ścieżka dopasowuje się inaczej w różnych dialektach.

Trzy widoki wyniku: Wartości, Ścieżki, Oba

Wartości renderują dopasowane węzły jako tablicę JSON, dokładnie to, co konsumujesz w kodzie. Ścieżki renderują ścieżkę znormalizowaną każdego dopasowania, jak $['store']['book'][0]['title']. Oba pokazują je obok siebie, dzięki czemu możesz odwzorować każdą wartość na jej precyzyjną lokalizację. Aktywny widok utrzymuje się między sesjami.

Ścieżki znormalizowane dla każdego dopasowania

Każdy wynik niesie swoją kanoniczną ścieżkę znormalizowaną w nawiasach z cudzysłowami — sposób RFC 9535 na jednoznaczne zidentyfikowanie lokalizacji węzła niezależnie od tego, jak napisano wyrażenie. Dwa wyrażenia trafiające w ten sam węzeł produkują tę samą ścieżkę znormalizowaną, co czyni debugowanie niejednoznacznych zapytań prostym.

Pełne wsparcie selektorów

Korzeń $, bieżący element @, dziecko .name, rekurencyjne zejście ..name, symbol wieloznaczny [*], indeks tablicy [0], wycinek [start:end:step], unia [a,b] i wyrażenia filtrujące [?()] z operatorami porównania i logicznymi. Wbudowana ściąga dokumentuje każdy selektor, dzięki czemu nigdy nie musisz opuszczać strony, by go sprawdzić.

Rozszerzenia funkcyjne RFC 9535

Wywołuj length(), count(), match(), search() i value() wewnątrz wyrażeń — policz elementy tablicy, przetestuj łańcuch względem wzorca I-Regexp lub filtruj po rozmiarze zagnieżdżonej listy. Te standardowe funkcje są dostępne w domyślnym silniku; narzędzie poprosi cię o przełączenie silników, jeśli wywołasz je w trybie Classic.

Formatowanie, wczytywanie i przykłady

Formatuj JSON ładnie formatuje twoje wejście, dzięki czemu struktura jest czytelna przed zapytaniem. Wczytaj odczytuje plik .json lub .txt w całości w przeglądarce — nigdy nie jest nigdzie wysyłany. Lista Przykłady ładuje znane, sprawdzone wyrażenia startowe na przykładowych danych, dzięki czemu zobaczysz silnik w działaniu, zanim dostosujesz ścieżkę.

Udostępnianie linkiem bezpośrednim (bez wysyłania)

Kopiuj link koduje JSON, wyrażenie, silnik i widok do fragmentu hash adresu URL. Przeglądarki nigdy nie przesyłają fragmentów URL w żądaniach, więc udostępniony link odtwarza twój pełny stan na maszynie odbiorcy bez kontaktu z serwerami go-tools.org. Samowystarczalny i przyjazny audytowi do wspólnego debugowania.

W 100% prywatnie, tylko w przeglądarce

Twój JSON i twoje wyrażenie nigdy nie opuszczają twojego urządzenia. Żadnych żądań sieciowych, żadnego rejestrowania, żadnej analityki tego, co wpisujesz — sprawdź w DevTools → Sieć. Tylko preferencje silnika i widoku utrwalają się do localStorage. Bezpieczne dla zastrzeżonych ładunków, zredagowanych logów i wszelkich danych, których nie wkleiłbyś do jsonpath.com.

Opracowane przykłady

Wybierz wszystkie tytuły książek z dokumentu księgarni

$.store.book[*].title
["Sayings of the Century", "Sword of Honour", "Moby Dick", "The Lord of the Rings"]

Wklej klasyczny JSON księgarni Goessnera, wpisz wyrażenie, a widok Wartości zwróci tablicę JSON ze wszystkimi czterema tytułami. Przełącz na Ścieżki, aby zobaczyć każdy wynik jako ścieżkę znormalizowaną, np. $['store']['book'][0]['title']. Symbol wieloznaczny [*] iteruje po każdym elemencie tablicy book; .title rzutuje jeden składnik z każdego z nich.

Filtruj książki tańsze niż 10 za pomocą wyrażenia filtrującego

$.store.book[?(@.price < 10)].title
["Sayings of the Century", "Moby Dick"]

Selektor filtra [?()] zachowuje tylko te elementy tablicy, dla których predykat jest prawdziwy; @ to bieżący element. W danych księgarni (ceny 8.95, 12.99, 8.99, 22.99) kwalifikują się dwie książki. Oba silniki akceptują tę postać, ale pamiętaj, że Classic (Goessner) zapisuje ten sam filtr jako [?(@.price<10)] — przełącz silnik, jeśli skopiowałeś wyrażenie ze starszego narzędzia.

Przejdź całe drzewo za pomocą rekurencyjnego zejścia

$..author
["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"]

Operator .. zstępuje na każdy poziom dokumentu i zbiera każdy składnik author, gdziekolwiek się pojawi, niezależnie od głębokości zagnieżdżenia. Rekurencyjne zejście to najszybszy sposób na wyciągnięcie jednego pola z głęboko zagnieżdżonej lub nieregularnej struktury bez wypisywania pełnej ścieżki.

Wytnij wycinek tablicy za pomocą [start:end:step]

$.store.book[0:2].title
["Sayings of the Century", "Sword of Honour"]

Wycinki tablicy stosują tę samą półotwartą konwencję [start:end] co Python i JavaScript: indeks 0 aż do, ale bez indeksu 2, zwraca dwie pierwsze książki. Dodaj trzecie pole jako krok — $.store.book[::2] pobiera co drugi element. Górna granica jest wyłączna, co stanowi częstą pułapkę z błędem o jeden, którą widok Ścieżki wyraźnie ujawnia.

Filtruj po długości tytułu z funkcją length() z RFC 9535

$.store.book[?length(@.title) > 15]
[{"title": "Sayings of the Century", "author": "Nigel Rees", "price": 8.95}, {"title": "The Lord of the Rings", "author": "J. R. R. Tolkien", "price": 22.99}]

length() to jedna z pięciu standardowych funkcji RFC 9535 i jest poprawna wyłącznie wewnątrz wyrażenia filtrującego [?...] — nigdy jako samodzielny segment ścieżki, jak $.store.book.length(), który gramatyka RFC 9535 odrzuca (ta postać segmentu to rozszerzenie jsonpath-plus, a nie standardowy JSONPath). Tutaj filtr zachowuje każdą książkę, której tytuł ma więcej niż 15 znaków; w danych księgarni wybierane są tytuły dłuższe niż 15 znaków (na przykład „Sayings of the Century” i „The Lord of the Rings”), a krótsze, jak „Moby Dick” i „Sword of Honour”, są wykluczane. count(), match(), search() i value() również stosuje się wewnątrz filtrów. Te funkcje to cecha RFC 9535 — przełącz na silnik standardowy (domyślny), aby ich użyć; tryb Classic (Goessner) ich nie implementuje.

Wybierz unię dwóch nazwanych składników

$.store.book[0]['title','author']
["Sayings of the Century", "Nigel Rees"]

Selektor unii [a,b] zbiera kilkoro dzieci w jednym wyrażeniu. Tutaj pobiera jednocześnie tytuł i autora pierwszej książki. Unie działają także z indeksami tablic — [0,2] chwyta pierwszy i trzeci element. Widok Oba paruje każdą wartość z jej ścieżką znormalizowaną, dzięki czemu dokładnie widać, który składnik dał który wynik.

Jak używać testera JSONPath

  1. 1

    Wklej lub wczytaj swój JSON

    Przeciągnij JSON do pola wejściowego, wklej go lub kliknij Wczytaj, aby załadować plik .json / .txt z dysku. Formatuj JSON ponownie wcina dokument. Niepoprawny JSON jest oznaczany w miejscu komunikatem parsera, zanim wykonasz zapytanie.

  2. 2

    Wybierz silnik

    RFC 9535 (standard IETF z 2024 roku, bez eval) jest domyślny. Przełącz na Classic (Goessner), gdy uruchamiasz wyrażenie skopiowane ze starszego narzędzia, takiego jak jsonpath.com, aby wyniki zgadzały się z tym, co tam widziałeś.

  3. 3

    Wpisz swoje wyrażenie JSONPath

    Wiodący $ jest pokazany za ciebie. Zacznij od ścieżki dziecka, jak .store.book[*].title, indeksu, jak [0], rekurencyjnego zejścia, jak ..author, lub filtra, jak [?(@.price < 10)]. Wyniki aktualizują się na żywo w trakcie pisania.

  4. 4

    Przełącz widok wyniku

    Wartości pokazują tablicę JSON dopasowanych wartości. Ścieżki pokazują ścieżkę znormalizowaną każdego dopasowania, jak $['store']['book'][0]['title']. Oba pokazują je obok siebie, dzięki czemu możesz odwzorować każdą wartość na jej dokładną lokalizację w dokumencie.

  5. 5

    Skopiuj wynik lub udostępnij link bezpośredni

    Kopiuj wynik umieszcza wyjście w schowku. Kopiuj link koduje JSON, wyrażenie, silnik i widok do fragmentu hash adresu URL (bez wysyłania), dzięki czemu współpracownik może odtworzyć dokładne zapytanie lokalnie na własnej maszynie.

Częste błędy w JSONPath

Pominięto wiodący korzeń $

Każde wyrażenie JSONPath zaczyna się w korzeniu, zapisanym jako $. Pominięcie go (lub zapisanie ścieżki tak, jakby $ było domyślne) sprawia, że większość silników odrzuca wyrażenie. Tester pokazuje $ za ciebie, więc zacznij wejście od następnego selektora — kropki, nawiasu lub rekurencyjnego zejścia.

✗ Niepoprawne
store.book[*].title  →  invalid (no root)
✓ Poprawne
$.store.book[*].title  →  selects every title

Błąd wycinka o jeden — oczekiwano włączenia indeksu końcowego

Wycinki są półotwarte: [start:end] biegnie aż do, ale bez end. [0:2] zwraca dwa elementy (indeksy 0 i 1), nie trzy. Aby uwzględnić ostatni element po indeksie, użyj [start:] lub przesuń górną granicę o jeden poza niego.

✗ Niepoprawne
$.store.book[0:2]  →  first TWO books, not three
✓ Poprawne
$.store.book[0:3]  →  first three books (indices 0,1,2)

Użyto wyrażenia Classic w silniku RFC 9535 (lub odwrotnie)

Wyrażenie skopiowane z jsonpath.com lub jsonpath-plus może parsować się lub dopasowywać inaczej pod RFC 9535 z powodu różnic w filtrach, uniach i funkcjach. Jeśli wyniki wyglądają błędnie, przełącz przełącznik silnika, aby pasował do dialektu, dla którego napisano wyrażenie.

✗ Niepoprawne
Classic filter run under RFC 9535  →  parse error or unexpected nodes
✓ Poprawne
Switch engine to Classic (Goessner)  →  reproduces the original result

Wywołano funkcję RFC 9535 jako samodzielny segment

length(), count(), match(), search() i value() to rozszerzenia funkcyjne RFC 9535, które są poprawne wyłącznie wewnątrz filtra [?...]. Samodzielne wywołanie segmentu, jak $.store.book.length(), jest odrzucane przez gramatykę RFC 9535 (to rozszerzenie jsonpath-plus, a nie standard). Wywołaj funkcję wewnątrz filtra i użyj domyślnego silnika RFC 9535 — silnik Classic (Goessner) nie implementuje tych funkcji.

✗ Niepoprawne
$.store.book.length()  →  parse error (not a valid RFC 9535 segment)
✓ Poprawne
$.store.book[?length(@.title) > 15]  →  books with a title over 15 chars

Pominięto @ wewnątrz wyrażenia filtrującego

Wewnątrz filtra [?()] bieżącym elementem jest @, nie $. Zapisanie $.price odnosi się z powrotem do korzenia dokumentu, a nie do testowanego elementu, więc filtr wybiera nic albo wszystko. Użyj @, aby adresować składniki filtrowanego elementu.

✗ Niepoprawne
$.store.book[?($.price < 10)]  →  wrong scope
✓ Poprawne
$.store.book[?(@.price < 10)]  →  books under 10

Ujęto nazwę składnika błędną składnią

Notacja nawiasowa wymaga cudzysłowów wokół kluczy łańcuchowych: $['store'] lub $.store oba działają, ale $[store] (bez cudzysłowów w nawiasach) to błąd indeksu/identyfikatora. Użyj cudzysłowów wewnątrz nawiasów dla każdego klucza ze spacjami, kropkami lub znakami specjalnymi: $['first name'].

✗ Niepoprawne
$[store][book]  →  invalid bracket selectors
✓ Poprawne
$['store']['book']  →  same as $.store.book

Oczekiwano, że rekurencyjne zejście zatrzyma się na pierwszym poziomie

$..author nie zatrzymuje się na górze — zbiera każdy składnik author na każdej głębokości. Jeśli chcesz tylko bezpośrednie dzieci, wypisz ścieżkę. Rekurencyjne zejście po dużym dokumencie może zwrócić znacznie więcej węzłów, niż zamierzano.

✗ Niepoprawne
$..price  →  every price anywhere in the tree
✓ Poprawne
$.store.book[*].price  →  only book prices

Kto używa tego narzędzia

Wyciąganie pól z odpowiedzi API
Wyciągnij identyfikatory żądań, zagnieżdżone atrybuty zasobów lub listę nazw z ładunku JSON bez pisania kodu przechodzenia. Zbuduj ścieżkę tutaj na przykładowej odpowiedzi, potwierdź w widoku Wartości, że zwraca dokładnie te węzły, których chcesz, a potem wklej zweryfikowane wyrażenie do swojej aplikacji lub testu.
Pisanie asercji do testów integracyjnych
Wiele frameworków testowych i narzędzi do testowania kontraktów (REST Assured, Karate, Postman) używa JSONPath do asercji na ciałach odpowiedzi. Naszkicuj ścieżkę asercji tutaj, sprawdź, że wybiera właściwy węzeł względem prawdziwej odpowiedzi, i skopiuj ją do testu — łapiąc błędną ścieżkę, zanim zestaw stanie się czerwony.
Konfigurowanie przekształceń danych w potokach
Kubernetes, AWS Step Functions, Azure Logic Apps i wiele narzędzi ETL akceptuje JSONPath do adresowania pól w ładunkach zdarzeń. Prototypuj dokładną ścieżkę względem reprezentatywnego zdarzenia tutaj, potwierdź, że się rozwiązuje, i umieść ją w konfiguracji swojego potoku z pewnością, że wskazuje tam, gdzie zamierzasz.
Odtwarzanie wyniku z jsonpath.com prywatnie
Masz wyrażenie z ewaluatora opartego na serwerze, ale nie możesz wkleić swoich danych do strony trzeciej? Przełącz na tryb Classic (Goessner), załaduj swój JSON i odtwórz ten sam wynik lokalnie — żaden ładunek nigdy nie opuszcza twojej przeglądarki, więc zastrzeżone dane pozostają na twojej maszynie.
Migracja starszych wyrażeń do RFC 9535
Przechodzisz do systemu deklarującego zgodność z RFC 9535? Uruchom starsze wyrażenie w trybie Classic, a następnie przełącz na silnik RFC 9535, aby zobaczyć, czy wciąż się parsuje i dopasowuje te same węzły. Porównanie dwóch silników wskazuje różnice w filtrach, uniach i funkcjach, na które inaczej natknąłbyś się na produkcji.
Debugowanie, dlaczego ścieżka zwraca błędne węzły
Ścieżka, która wybiera zbyt wiele lub zbyt mało, jest trudna do przeanalizowania na podstawie samych wartości. Przełącz na widok Ścieżki, aby zobaczyć znormalizowaną lokalizację każdego dopasowania — dokładny indeks tablicy, dokładny łańcuch składników — a błąd wycinka o jeden lub zabłąkane rekurencyjne zejście stanie się natychmiast oczywiste.
Nauczanie lub recenzowanie JSONPath
Otwórz działające wyrażenie na przykładowych danych i przejdź przez nie selektor po selektorze, przełączając między Wartości i Ścieżki, aby uczący się widział zarówno to, co jest wybierane, jak i gdzie się znajduje. Ściąga i opracowane przykłady dają ustrukturyzowane odniesienie do recenzji kodu lub wdrażania.

Uwagi o silniku i algorytmie

Silnik RFC 9535 (jsonpath-rfc9535, bez zależności)
Domyślny silnik implementuje gramatykę IETF RFC 9535 bezpośrednio: tokenizuje i parsuje wyrażenie do abstrakcyjnego drzewa składniowego oraz interpretuje je względem dokumentu. Nigdzie na ścieżce nie ma eval ani konstruktora Function, więc jest odporny na klasę błędów wstrzykiwania eval i działa pod ścisłą Content-Security-Policy.
Silnik Classic (jsonpath-plus, eval wyłączony)
Silnik Classic (Goessner) to jsonpath-plus przypięty do załatanego wydania (>= 10.4.0) i skonstruowany z opcją eval jawnie ustawioną na false. To zachowuje zgodność z dialektem Goessnera, jednocześnie zamykając wektory zdalnego wykonania kodu śledzone jako CVE-2024-21534 i CVE-2025-1302, które dotyczyły domyślnej ścieżki filtra biblioteki opartej na eval.
Generowanie ścieżek znormalizowanych
Każde dopasowanie jest raportowane ze swoją ścieżką znormalizowaną RFC 9535 — formą kanoniczną używającą notacji nawiasowej z pojedynczymi cudzysłowami ($['store']['book'][0]['title']) z indeksami tablic jako gołymi liczbami całkowitymi. Ścieżki znormalizowane są stabilne i unikalne dla węzła, więc równoważne wyrażenia dają identyczne ścieżki, na czym widoki Ścieżki i Oba opierają jednoznaczną identyfikację wyniku.
Leniwie ładowane fragmenty silników
Oba silniki są ładowane jako osobne fragmenty JavaScriptu dopiero przy pierwszym wyborze, dzięki czemu początkowa strona pozostaje lekka, a silnik, którego nie używasz, nigdy nie jest pobierany. Przełączenie silników natychmiast ponownie ewaluuje bieżące wyrażenie względem bieżącego dokumentu, bez przeładowania strony.
Lokalne odczytywanie plików i formatowanie JSON
Przycisk Wczytaj używa przeglądarkowego API FileReader do odczytania pliku .json lub .txt do wejścia w całości po stronie klienta — plik nigdy nie jest przesyłany. Formatuj JSON parsuje i ponownie serializuje wejście z wcięciem dwóch spacji, ujawniając błędy parsowania w miejscu, dzięki czemu zniekształcony JSON jest łapany przed ewaluacją.
Linki bezpośrednie przez fragment hash URL (nigdy nie przesyłane)
Stan udostępniania jest kodowany we fragmencie location.hash, niosąc JSON, wyrażenie, aktywny silnik i widok wyniku. Przeglądarki nigdy nie dołączają fragmentu do żądań HTTP, więc serwery go-tools.org otrzymują zero danych przy otwarciu linku bezpośredniego; nawadnianie odbywa się w całości na urządzeniu odbiorcy.

Najlepsze praktyki JSONPath

Wybierz silnik pasujący do twojego celu
Jeśli twój system docelowy deklaruje zgodność z RFC 9535, pisz i weryfikuj względem silnika RFC 9535. Jeśli odtwarzasz lub utrzymujesz wyrażenie ze starszego narzędzia lub biblioteki, użyj Classic (Goessner). Walidacja względem błędnego dialektu to najczęstszy powód, dla którego ścieżka, która działała w testerze, zawodzi na produkcji.
Weryfikuj widokiem Ścieżki, nie tylko Wartości
Widok Wartości mówi ci, co się dopasowało; widok Ścieżki mówi, gdzie. Gdy zapytanie zwraca poprawnie wyglądające wartości, może i tak wybierać je z błędnej lokalizacji — zabłąkane rekurencyjne zejście lub zbyt szeroki symbol wieloznaczny. Sprawdź ścieżki znormalizowane, aby potwierdzić, że wyrażenie trafia dokładnie w te węzły, które zamierzasz.
Pamiętaj o wyłącznym końcu wycinka
[0:2] wybiera indeksy 0 i 1, nie 0 do 2 — górna granica jest wyłączna, tak jak w Pythonie i JavaScripcie. Błędy wycinka o jeden to najczęstszy błąd JSONPath. Użyj widoku Ścieżki, aby odczytać dokładny indeks każdego wybranego elementu i potwierdzić granicę, zanim wyślesz.
Preferuj jawną ścieżkę nad rekurencyjnym zejściem, gdy możesz
$..price jest wygodne, ale dopasowuje każdą cenę gdziekolwiek w dokumencie, w tym te, których nie zamierzałeś. Gdy znasz strukturę, wypisz ścieżkę ($.store.book[*].price), aby zapytanie pozostało precyzyjne i przewidywalne w miarę wzrostu danych. Zarezerwuj .. dla naprawdę nieregularnych lub nieznanych kształtów.
Zachowuj spójne białe znaki i cudzysłowy w filtrach
RFC 9535 dokładnie trzyma się swojej gramatyki dla wyrażeń filtrujących, podczas gdy klasyczny dialekt jest luźniejszy. Pisz filtry czysto — ujmuj literały łańcuchowe w pojedyncze cudzysłowy ('fiction'), zachowuj odstępy wokół operatorów i unikaj polegania na pobłażliwym parsowaniu — aby to samo wyrażenie ewaluowało się tak samo niezależnie od tego, który silnik lub biblioteka ostatecznie je uruchomi.

Najczęściej zadawane pytania

Czy mój JSON lub wyrażenie JSONPath jest wysyłane na wasz serwer?
Nie. Każda ewaluacja działa w JavaScripcie wewnątrz twojej przeglądarki. Twój dokument JSON i twoje wyrażenie JSONPath nie są przesyłane, rejestrowane, zapisywane na dysku ani wysyłane do żadnej strony trzeciej. Tylko twoje preferencje interfejsu — aktywny silnik (RFC 9535 lub Classic) i widok wyniku (Wartości / Ścieżki / Oba) — są zapisywane w localStorage, aby strona zapamiętała je przy następnej wizycie; sam JSON i wyrażenie nigdy nie są utrwalane. Możesz to sprawdzić, otwierając DevTools → Sieć: wpisywanie tekstu w dowolnym polu nie wywołuje żadnych żądań. To czyni to narzędzie bezpiecznym dla zastrzeżonych ładunków API, zredagowanych próbek logów, wewnętrznej konfiguracji i wszystkiego, czego nie wkleiłbyś do ewaluatora opartego na serwerze, takiego jak jsonpath.com.
Czym jest JSONPath i do czego służy?
JSONPath to język zapytań dla JSON-a, tak jak XPath jest językiem zapytań dla XML-a. Piszesz wyrażenie ścieżki — na przykład $.store.book[*].author — a ewaluator zwraca każdą wartość w dokumencie, którą ta ścieżka wybiera. Używa się go do wyciągania konkretnych pól z odpowiedzi API, do asercji wartości w testach integracyjnych, do konfigurowania przekształceń danych w narzędziach takich jak Jenkins, Kubernetes, AWS Step Functions i Azure Logic Apps oraz do ekstrakcji danych z dużego lub nieregularnego JSON-a bez pisania imperatywnego kodu przechodzenia. Wyrażenie buduje się z osi selektorów: $ (korzeń), . lub [] (dostęp do dziecka), .. (rekurencyjne zejście), * (symbol wieloznaczny), [start:end:step] (wycinek tablicy), [a,b] (unia) i [?()] (filtr). Ten tester ewaluuje wyrażenie na żywo i pokazuje zarówno dopasowane wartości, jak i ich ścieżki znormalizowane.
Jaka jest różnica między RFC 9535 a klasyczną składnią Goessnera?
Klasyczny JSONPath to faktyczny standard składni, który Stefan Goessner opublikował w 2007 roku. Stał się szeroko implementowany, lecz nigdy nie został formalnie ustandaryzowany, więc subtelne zachowania — jak zapisuje się filtry, jak działają unie i funkcja korzenia, jak porównywane są nieobecne wartości — rozeszły się między bibliotekami. RFC 9535, opublikowane przez IETF w lutym 2024 roku, to pierwsza formalna specyfikacja JSONPath. Ustala precyzyjną gramatykę, definiuje ścieżki znormalizowane dla wyników i dodaje standardowe funkcje (length, count, match, search, value). Oba warianty są bliskie, ale nie identyczne: RFC 9535 jest bardziej rygorystyczne co do białych znaków i cudzysłowów w filtrach, definiuje semantykę porównań dla brakujących składników i odrzuca część luźnych konstrukcji, które tolerował klasyczny dialekt. To narzędzie domyślnie używa silnika RFC 9535 (implementacji bez zależności i bez eval) i pozwala przełączyć się na silnik Classic (Goessner) dla zgodności wstecznej.
Dlaczego to samo wyrażenie zwraca różne wyniki w obu silnikach i jak użyć wyrażenia skopiowanego z jsonpath.com?
Ponieważ RFC 9535 i klasyczny dialekt Goessnera mają naprawdę różne reguły w przypadkach brzegowych — białe znaki i cudzysłowy w filtrach, kolejność unii, sposób porównywania brakujących składników oraz to, jakie funkcje istnieją. Wyrażenie napisane dla jednego silnika może dopasować się inaczej (lub nie sparsować się) w drugim. Jeśli skopiowałeś wyrażenie ze starszego narzędzia, takiego jak jsonpath.com, jsonpath-plus lub usługa oparta na Jayway, przełącz przełącznik silnika u góry na Classic (Goessner): ten tryb uruchamia ewaluator zgodny z Goessnerem (zbudowany na jsonpath-plus, skonstruowany z wyłączonym eval) i odtworzy zachowanie, które widziałeś w narzędziu źródłowym. Jeśli piszesz nowe wyrażenie lub celujesz w system deklarujący zgodność z RFC 9535, zostaw domyślny silnik RFC 9535. Ściąga i wbudowane przykłady są napisane tak, aby ewaluowały się identycznie w obu silnikach, dzięki czemu masz znany, sprawdzony punkt wyjścia.
Jak działają wyrażenia filtrujące [?()]?
Selektor filtra zachowuje tylko te elementy tablicy (lub składniki obiektu), dla których predykat jest prawdziwy. Wewnątrz filtra @ odnosi się do bieżącego testowanego elementu. $.store.book[?(@.price < 10)] zwraca każdą książkę, której składnik price jest mniejszy niż 10. Możesz porównywać z literałami (@.isbn, @.category == 'fiction'), łączyć warunki operatorami && i ||, testować istnienie składnika (@.isbn wybiera elementy, które w ogóle mają isbn), a w RFC 9535 używać rozszerzeń funkcyjnych wewnątrz predykatu (?(length(@.tags) > 2)). Operatory porównania to ==, !=, <, <=, >, >=. RFC 9535 jest precyzyjne co do typów: porównanie brakującego składnika do wartości jest dobrze zdefiniowane i nie powoduje wyjątku. Klasyczny dialekt jest luźniejszy co do białych znaków, więc [?(@.price<10)] i [?(@.price < 10)] są tam oba akceptowane; RFC 9535 trzyma się swojej gramatyki dokładnie.
Co robi rekurencyjne zejście (..)?
Operator .. przeszukuje każdy poziom dokumentu, nie tylko bezpośrednie dzieci. $..author zbiera każdy składnik author, gdziekolwiek występuje — wewnątrz obiektu najwyższego poziomu, wewnątrz tablic, wewnątrz zagnieżdżonych obiektów, na dowolnej głębokości. To najszybszy sposób na wyciągnięcie pola z głęboko zagnieżdżonej lub nieregularnie ukształtowanej struktury, gdy nie chcesz (lub nie możesz) wypisać pełnej ścieżki. Po .. możesz dodać dowolny selektor: $..book[*] znajduje każdy element każdej tablicy book w dowolnym miejscu drzewa, $..* wylicza każdą wartość w dokumencie, a $..['price'] zbiera wszystkie składniki price. Rekurencyjne zejście może dopasować bardzo wiele — przełącz na widok Ścieżki, aby zobaczyć dokładnie, skąd pochodzi każdy wynik dzięki jego ścieżce znormalizowanej.
Czym są funkcje RFC 9535 length(), count(), match(), search() i value()?
RFC 9535 definiuje pięć standardowych rozszerzeń funkcyjnych, a kluczowa reguła brzmi, że są one wywoływalne wyłącznie wewnątrz wyrażenia filtrującego [?...] — nigdy jako samodzielny segment ścieżki. Zapisanie $.store.book.length() nie jest poprawne według RFC 9535 i standardowa gramatyka to odrzuca (ta postać wywołania segmentu to rozszerzenie jsonpath-plus, a nie część specyfikacji). length() zwraca długość łańcucha, tablicy lub obiektu, więc używasz go do filtrowania według rozmiaru: $.store.book[?length(@.title) > 15] zachowuje książki, których tytuł jest dłuższy niż 15 znaków. count() zwraca liczbę węzłów, które zawiera lista węzłów, ponownie wewnątrz filtra: $.store.book[?(count(@.authors) > 1)]. match() sprawdza, czy łańcuch pasuje do wyrażenia regularnego względem całej wartości, a search() sprawdza dopasowanie gdziekolwiek wewnątrz łańcucha — oba przyjmują wzorzec I-Regexp. value() konwertuje jednowęzłową listę węzłów do jej wartości, aby można jej było użyć w porównaniu. Te funkcje są częścią standardu RFC 9535, więc są dostępne w domyślnym silniku; silnik Classic (Goessner) ich nie implementuje. Jeśli wyrażenie oparte na funkcji zawodzi, upewnij się, że wywołujesz je wewnątrz filtra i że przełącznik silnika jest ustawiony na RFC 9535.
Jak działają wycinki tablicy [start:end:step]?
Wycinki używają tej samej półotwartej konwencji co Python i JavaScript: [start:end] wybiera od indeksu start aż do, ale bez indeksu end, więc [0:2] zwraca dwa pierwsze elementy (indeksy 0 i 1). Pomiń granicę, aby dojść do krawędzi — [2:] od indeksu 2 wzwyż, [:3] dla trzech pierwszych. Ujemny indeks liczy od końca: [-1:] wybiera ostatni element. Opcjonalne trzecie pole to krok — [::2] pobiera co drugi element, [::-1] odwraca (w silnikach obsługujących ujemne kroki). Wyłączna górna granica to najczęstszy błąd wycinka; widok Ścieżki pokazuje dokładny indeks każdego wybranego elementu, dzięki czemu możesz potwierdzić granicę jednym rzutem oka.
Czym jest selektor unii i jak wybrać wiele kluczy naraz?
Selektor unii wymienia kilka nazw lub indeksów wewnątrz jednego nawiasu i zbiera je wszystkie: $['title','author'] wybiera oba składniki z obiektu, a $.store.book[0,2] wybiera pierwszy i trzeci element tablicy book. Możesz mieszać go z innymi selektorami — $.store.book[*]['title','price'] pobiera tytuł i cenę każdej książki. Unie są przydatne, gdy chcesz stałe rzutowanie kilku pól, a nie całego obiektu lub symbolu wieloznacznego. Widok Oba to najczytelniejszy sposób na odczytanie wyniku unii, ponieważ paruje każdą wybraną wartość z jej ścieżką znormalizowaną, dzięki czemu poznasz, która nazwa lub indeks dał każdy wpis.
Czy mogę udostępnić zapytanie JSONPath i jego JSON przez link?
Tak — a link nie wiąże się z żadną wymianą z serwerem. Kliknij Kopiuj link na pasku akcji: tester koduje JSON, wyrażenie, aktywny silnik i widok wyniku do fragmentu hash adresu URL. Każdy, kto otworzy link, nawodni stronę tym samym stanem, lokalnie na własnej maszynie. Ponieważ dane żyją we fragmencie hash, nigdy nie są przesyłane do serwera go-tools.org — przeglądarki nie wysyłają fragmentu w żądaniach HTTP — i nigdy nie pojawiają się w naszych logach dostępu. Długość linku rośnie wraz z rozmiarem JSON-a, więc dla dużych dokumentów udostępnij tylko wyrażenie i pozwól odbiorcy wkleić własne dane, albo użyj przycisku Wczytaj, aby załadować plik lokalnie. To czyni linki bezpośrednie bezpiecznymi do wspólnego debugowania bez ujawniania ładunku jakiemukolwiek zapleczu.
Czy istnieje maksymalny rozmiar JSON-a?
Ewaluacja jest ograniczona pamięcią twojej przeglądarki, a nie sztywnym limitem, ale praktyczny optymalny zakres to dokumenty do kilku megabajtów — z dużym zapasem większe niż niemal każda pojedyncza odpowiedź API. Bardzo duże tablice z szerokimi selektorami (rekurencyjny symbol wieloznaczny $..* po dziesiątkach tysięcy węzłów) wyprodukują duży zbiór wyników, którego renderowanie potrwa dłużej; zawęź wyrażenie, aby utrzymać czytelność wyniku. Przycisk Wczytaj odczytuje plik .json lub .txt w całości w przeglądarce (nigdy nie jest nigdzie wysyłany), a Formatuj JSON ponownie wcina wejście, dzięki czemu możesz odczytać strukturę przed wykonaniem zapytania. Dla wielomegabajtowych potoków danych zweryfikuj swoje wyrażenie tutaj na reprezentatywnym wycinku, a następnie uruchom tę samą ścieżkę w kodzie swojej aplikacji lub w narzędziu CLI, takim jak jq.
Czym to się różni od jsonpath.com i czy jest bezpieczne — bez eval?
Cztery różnice. (1) Prywatność: jsonpath.com i większość ewaluatorów online działa na serwerze lub osadza bibliotekę, która ewaluuje filtry za pomocą javascriptowego eval; to narzędzie działa w całości w twojej przeglądarce i nie używa żadnego eval. Domyślny silnik RFC 9535 to implementacja bez zależności i bez ścieżki eval, a silnik Classic (Goessner) jest zbudowany na jsonpath-plus przypiętym do załatanego wydania z jawnie wyłączonym eval — co zamyka klasę błędów zdalnego wykonania kodu śledzoną jako CVE-2024-21534 i CVE-2025-1302. To także oznacza, że narzędzie działa pod ścisłą Content-Security-Policy. (2) Standardy: to jeden z niewielu testerów online oferujących prawdziwy silnik RFC 9535, a nie tylko starszy dialekt Goessnera. (3) Dwa silniki: możesz przełączać się między RFC 9535 a Classic, aby porównywać wyniki lub uruchamiać wyrażenia skopiowane ze starszych narzędzi, obok siebie. (4) Języki: interfejs jest dostępny w 15 językach. Jeśli potrzebujesz tylko szybkich sprawdzeń składni starszego typu, jsonpath.com nadal działa; dla zgodnej ze standardem, prywatnej ewaluacji bez eval to bezpieczniejszy wybór.
Co pokazują widoki Wartości, Ścieżki i Oba?
Wynikiem zapytania JSONPath jest lista węzłów — zbiór węzłów wewnątrz twojego dokumentu. Widok Wartości renderuje te węzły jako tablicę JSON z dopasowanymi wartościami, dokładnie to, co skonsumowałbyś w kodzie. Widok Ścieżki renderuje zamiast tego ścieżkę znormalizowaną każdego dopasowania — kanoniczną lokalizację w nawiasach z cudzysłowami, taką jak $['store']['book'][0]['title'], która jednoznacznie identyfikuje, gdzie w dokumencie znajduje się wartość, niezależnie od tego, jak napisano wyrażenie. Ścieżki znormalizowane to koncepcja RFC 9535 i są nieocenione przy debugowaniu: dwa różne wyrażenia, które wybierają ten sam węzeł, produkują tę samą ścieżkę znormalizowaną. Widok Oba pokazuje obie obok siebie, dzięki czemu możesz dopasować każdą wartość do jej lokalizacji jednym rzutem oka. Twój wybrany widok utrzymuje się między sesjami dzięki localStorage.
Czy to działa offline i co z Content-Security-Policy?
Tak na oba pytania. Ponieważ każda ewaluacja działa w twojej przeglądarce bez wywołań sieciowych, narzędzie działa nadal po wczytaniu strony, nawet jeśli przejdziesz w tryb offline. A ponieważ żaden silnik nie używa eval ani konstruktora Function do ewaluacji wyrażeń filtrujących, narzędzie działa pod ścisłą Content-Security-Policy, która zabrania unsafe-eval — polityką, którą egzekwuje wiele organizacji dbających o bezpieczeństwo i która psuje biblioteki JSONPath oparte na eval. Silnik RFC 9535 parsuje i interpretuje wyrażenia własną gramatyką, zamiast kompilować je do JavaScriptu, a silnik Classic jest skonfigurowany z wyłączonym eval. Jeśli musisz ewaluować JSONPath wewnątrz utwardzonego środowiska wewnętrznego, to narzędzie jest zaprojektowane, by działać tam bez wyjątków od polityki.

Powiązane narzędzia

Zobacz wszystkie narzędzia →