Skip to main content
CheckTown
Narzędzia dev

JSONPath: jezyk zapytan do wydobywania danych z JSON

Opublikowano 7 min czytania
W tym artykule

Czym jest JSONPath?

JSONPath to język zapytań do wyodrębniania danych z dokumentów JSON. Podobnie jak XPath nawiguje dokumenty XML, JSONPath nawiguje struktury JSON przy użyciu zwięzłej składni wyrażeń. Został sformalizowany w RFC 9535 (luty 2024) po latach nieformalnej specyfikacji.

Wyrażenia JSONPath zaczynają się od $ (elementu głównego) i używają notacji kropkowej lub nawiasowej do przechodzenia przez dokument. Język obsługuje symbole wieloznaczne, rekurencyjne schodzenie, wycinanie tablic i wyrażenia filtrujące — co umożliwia wyodrębnianie głęboko zagnieżdżonych wartości za pomocą jednego wyrażenia.

Składnia JSONPath

JSONPath zapewnia kilka operatorów do nawigowania i filtrowania struktur JSON.

  • Root ($) — każde wyrażenie JSONPath zaczyna się od $, reprezentującego obiekt główny lub tablicę dokumentu JSON
  • Notacja kropkowa ($.store.book) — dostęp do właściwości potomnych według nazwy, podobnie jak dostęp do obiektów JavaScript. Kropki oddzielają każdy poziom zagnieżdżenia.
  • Notacja nawiasowa ($['store']['book']) — alternatywna składnia używająca cytowanych nazw właściwości w nawiasach. Wymagana, gdy nazwy właściwości zawierają znaki specjalne lub spacje.
  • Wildcard (*) — pasuje do wszystkich elementów na bieżącym poziomie. $.store.* zwraca wszystkie bezpośrednie elementy podrzędne store; $[*] zwraca wszystkie elementy tablicy głównej.
  • Rekurencyjne schodzenie (..) — przeszukuje wszystkich potomków na dowolnej głębokości. $..price znajduje każde pole 'price' w dowolnym miejscu dokumentu, niezależnie od poziomu zagnieżdżenia.
  • Wycinanie tablic ([start:end:step]) — wybiera zakres elementów tablicy. $[0:3] zwraca pierwsze trzy elementy; $[-2:] zwraca ostatnie dwa; $[::2] zwraca co drugi element.

Przykłady wyrażeń JSONPath

Oto praktyczne przykłady pokazujące, jak wyrażenia JSONPath wyodrębniają dane z rzeczywistych struktur JSON.

  • Wyodrębnianie zagnieżdżonych wartości — $.users[0].name pobiera imię pierwszego użytkownika. $.config.database.host pobiera głęboko zagnieżdżoną wartość konfiguracji.
  • Filtrowanie tablic — $.users[?(@.age > 18)] zwraca wszystkich użytkowników starszych niż 18 lat. $.products[?(@.price < 50)] znajduje niedrogie produkty. Filtry używają @ do odwoływania się do bieżącego elementu.
  • Zapytania wielopoziomowe — $..author zwraca każde pole autora na dowolnej głębokości. $.store.book[*].title zwraca wszystkie tytuły książek. $.orders[*].items[*].sku wyodrębnia kody SKU ze wszystkich zamówień i pozycji.

Te wyrażenia można łączyć, aby tworzyć zaawansowane zapytania. Na przykład $.store.book[?(@.price < 10)].title zwraca tytuły wszystkich książek tańszych niż 10.

Wypróbuj za darmo — bez rejestracji

Testuj wyrazenia JSONPath →

Typowe przypadki użycia

JSONPath jest używany wszędzie tam, gdzie ustrukturyzowane dane muszą być odpytywane lub wyodrębniane z dokumentów JSON.

  • Wyodrębnianie odpowiedzi API — pobierz konkretne pola ze złożonych odpowiedzi API bez pisania własnego kodu parsowania. Testuj wyrażenia na przykładowych odpowiedziach przed kodowaniem.
  • Parsowanie konfiguracji — wyodrębniaj wartości z plików konfiguracyjnych JSON w potokach CI/CD, skryptach wdrożeniowych i narzędziach infrastruktury jako kodu
  • Analiza logów — odpytuj ustrukturyzowane logi JSON, aby znajdować konkretne zdarzenia, wzorce błędów lub metryki wydajności w dużych plikach logów
  • Transformacja danych — używaj JSONPath w potokach ETL do wybierania, filtrowania i przekształcania danych JSON podczas operacji importu/eksportu

JSONPath vs JQ vs JMESPath

Kilka języków zapytań jest ukierunkowanych na dokumenty JSON. Każdy ma inne mocne strony i wsparcie ekosystemu.

  • JSONPath — standardowa składnia zapytań (RFC 9535), szeroko obsługiwana w bibliotekach programistycznych (Java, Python, JavaScript, PHP). Najlepszy do prostego wyodrębniania i filtrowania. Brak wbudowanej transformacji.
  • JQ — procesor JSON wiersza poleceń z potężnym językiem funkcyjnym. Obsługuje transformację, obliczenia i formatowanie wyjścia. Najlepszy do skryptowania powłoki i przetwarzania danych wiersza poleceń.
  • JMESPath — język zapytań używany przez AWS CLI i Boto3. Ściślejsza składnia niż JSONPath z wbudowanymi funkcjami. Najlepszy do integracji z ekosystemem AWS i programowego odpytywania.

Często zadawane pytania

Czy JSONPath używa indeksowania tablic od zera czy od jedynki?

JSONPath używa indeksowania tablic od zera, zgodnie z większością języków programowania. $[0] zwraca pierwszy element, $[1] zwraca drugi i tak dalej. Ujemne indeksy liczą od końca: $[-1] zwraca ostatni element, $[-2] zwraca przedostatni.

Jak działają wyrażenia filtrujące w JSONPath?

Wyrażenia filtrujące używają składni [?(expression)], gdzie @ odnosi się do bieżącego ocenianego elementu. Możesz używać operatorów porównania (==, !=, <, >, <=, >=), operatorów logicznych (&& i ||) oraz dostępu do właściwości (np. @.name). Przykład: $[?(@.status == 'active')] zwraca elementy, gdzie status jest równy 'active'.

Czy wszystkie implementacje JSONPath są zgodne?

Nie w pełni. Przed RFC 9535 (2024) JSONPath nie miał formalnego standardu i implementacje się różniły. Typowe różnice obejmują składnię wyrażeń filtrujących, zachowanie rekurencyjnego schodzenia i obsługę brakujących właściwości. RFC 9535 ma na celu standaryzację zachowania, ale starsze biblioteki mogą nadal stosować różne konwencje. Zawsze testuj wyrażenia względem swojej konkretnej implementacji.

Powiązane narzędzia