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.