4 Funkcjonalność JSONPath
Przegląd
Ta sekcja przedstawia obsługiwaną funkcjonalność JSONPath w krokach wstępnego przetwarzania wartości pozycji.
JSONPath składa się z segmentów oddzielonych kropkami.
Segment może mieć postać prostego słowa, reprezentującego nazwę wartości JSON, znaku wieloznacznego (*) lub bardziej złożonej konstrukcji ujętej w nawiasy kwadratowe.
Kropka przed segmentem ujętym w nawiasy jest opcjonalna i może zostać pominięta.
| Przykład JSONPath | Opis |
|---|---|
$.object.name |
Zwraca zawartość object.name. |
$.object['name'] |
Zwraca zawartość object.name. |
$.object.['name'] |
Zwraca zawartość object.name. |
$["object"]['name'] |
Zwraca zawartość object.name. |
$.['object'].["name"] |
Zwraca zawartość object.name. |
$.object.history.length() |
Zwraca liczbę elementów tablicy object.history. |
$[?(@.name == 'Object')].price.first() |
Zwraca wartość właściwości price z pierwszego obiektu o nazwie „Object”. |
$[?(@.name == 'Object')].history.first().length() |
Zwraca liczbę elementów tablicy historii z pierwszego obiektu o nazwie „Object”. |
$[?(@.price > 10)].length() |
Zwraca liczbę obiektów z ceną większą niż 10. |
Zobacz także: Escaping special characters from LLD macro values in JSONPath.
Obsługiwane segmenty
| Segment | Opis |
|---|---|
<name> |
Dopasowuje właściwość obiektu według nazwy. |
* |
Dopasowuje wszystkie właściwości obiektu. |
['<name>'] |
Dopasowuje właściwość obiektu według nazwy. |
['<name>', '<name>', ...] |
Dopasowuje właściwość obiektu według dowolnej z podanych nazw. |
[<index>] |
Dopasowuje element tablicy według indeksu. |
[<number>, <number>, ...] |
Dopasowuje element tablicy według dowolnego z podanych indeksów. |
[*] |
Dopasowuje wszystkie właściwości obiektu lub elementy tablicy. |
[<start>:<end>] |
Dopasowuje elementy tablicy według zdefiniowanego zakresu: <start> - pierwszy dopasowywany indeks (włącznie); jeśli nie został określony, dopasowywane są wszystkie elementy tablicy od początku; jeśli jest ujemny, określa przesunięcie początkowe liczone od końca tablicy; <end> - ostatni dopasowywany indeks (z wyłączeniem); jeśli nie został określony, dopasowywane są wszystkie elementy tablicy do końca; jeśli jest ujemny, określa przesunięcie początkowe liczone od końca tablicy. |
[?(<expression>)] |
Dopasowuje obiekty/elementy tablicy przez zastosowanie wyrażenia filtra. |
Aby znaleźć pasujący segment z pominięciem jego pochodzenia (segment odłączony), należy poprzedzić go dwiema kropkami (..).
Na przykład $..name lub $..['name'] zwracają wartości wszystkich właściwości name.
Nazwy dopasowanych elementów można wyodrębnić, dodając do JSONPath sufiks tyldy (~).
Zwraca on nazwę dopasowanego obiektu lub indeks dopasowanego elementu tablicy w formacie ciągu znaków.
Format wyjściowy jest zgodny z tymi samymi zasadami co w przypadku innych zapytań JSONPath — wyniki ścieżki określonej są zwracane „tak jak są”, a wyniki ścieżki nieokreślonej są zwracane w tablicy.
Jednak wyodrębnianie nazwy elementu dopasowanego przez ścieżkę określoną ma niewielką wartość, ponieważ jest ona już znana.
Wyrażenie filtra
Wyrażenie filtra jest wyrażeniem arytmetycznym w notacji infiksowej.
Obsługiwane operandy:
| Operand | Opis |
|---|---|
"<text>"'<text>' |
Stała tekstowa. Przykład: 'value: \\'1\\''"value: '1'" |
<number> |
Stała liczbowa obsługująca notację naukową. Przykład: 123 |
<jsonpath starting with $> |
Wartość wskazywana przez JSONPath od węzła głównego dokumentu wejściowego; obsługiwane są tylko ścieżki jednoznaczne. Przykład: $.object.name |
<jsonpath starting with @> |
Wartość wskazywana przez JSONPath od bieżącego obiektu/elementu; obsługiwane są tylko ścieżki jednoznaczne. Przykład: @.name |
Obsługiwane operatory:
| Operator | Typ | Opis | Wynik |
|---|---|---|---|
- |
Binarny | Odejmowanie | Liczba |
+ |
Binarny | Dodawanie | Liczba |
/ |
Binarny | Dzielenie | Liczba |
* |
Binarny | Mnożenie | Liczba |
== |
Binarny | Równość | Wartość logiczna (1/0) |
!= |
Binarny | Nierówność | Wartość logiczna (1/0) |
< |
Binarny | Mniejsze niż | Wartość logiczna (1/0) |
<= |
Binarny | Mniejsze niż lub równe | Wartość logiczna (1/0) |
> |
Binarny | Większe niż | Wartość logiczna (1/0) |
>= |
Binarny | Większe niż lub równe | Wartość logiczna (1/0) |
=~ |
Binarny | Pasuje do wyrażenia regularnego | Wartość logiczna (1/0) |
! |
Unarny | Logiczne NOT | Wartość logiczna (1/0) |
|| |
Binarny | Logiczne OR | Wartość logiczna (1/0) |
&& |
Binarny | Logiczne AND | Wartość logiczna (1/0) |
Funkcje
Funkcje mogą być używane na końcu JSONPath. Można łączyć wiele funkcji w łańcuch, jeśli poprzedzająca funkcja zwraca wartość akceptowaną przez następną funkcję.
Obsługiwane funkcje:
| Funkcja | Opis | Wejście | Wyjście |
|---|---|---|---|
avg |
Średnia wartość liczb w tablicy wejściowej | Tablica liczb | Liczba |
min |
Minimalna wartość liczb w tablicy wejściowej | Tablica liczb | Liczba |
max |
Maksymalna wartość liczb w tablicy wejściowej | Tablica liczb | Liczba |
sum |
Suma liczb w tablicy wejściowej | Tablica liczb | Liczba |
length |
Liczba elementów w tablicy wejściowej | Tablica | Liczba |
first |
Pierwszy element tablicy | Tablica | Konstrukcja JSON (obiekt, tablica, wartość) zależnie od zawartości tablicy wejściowej |
Funkcje agregujące JSONPath akceptują ujęte w cudzysłów wartości liczbowe. Wartości te są automatycznie konwertowane z ciągów znaków na typy liczbowe, gdy wymagana jest agregacja. Niezgodne dane wejściowe spowodują wygenerowanie błędu przez funkcję.
Wartość wyjściowa
Ścieżki JSONPath można podzielić na ścieżki określone i nieokreślone. Ścieżka określona może zwrócić tylko null lub jedno dopasowanie. Ścieżka nieokreślona może zwrócić wiele dopasowań: JSONPath z odłączonymi segmentami, wieloma listami nazw/indeksów, wycinkami tablic lub segmentami wyrażeń. Jednak gdy używana jest funkcja, JSONPath staje się ścieżką określoną, ponieważ funkcje zawsze zwracają pojedynczą wartość.
Ścieżka określona zwraca obiekt/tablicę/wartość, do których się odwołuje. Natomiast ścieżka nieokreślona zwraca tablicę dopasowanych obiektów/tablic/wartości.
Kolejność właściwości w wynikach zapytania JSONPath może nie odpowiadać oryginalnej kolejności właściwości w JSON ze względu na wewnętrzne metody optymalizacji.
Na przykład JSONPath $.books[1]["author", "title"] może zwrócić ["title", "author"].
Jeśli zachowanie oryginalnej kolejności właściwości jest istotne, należy rozważyć alternatywne metody przetwarzania po wykonaniu zapytania.
Zasady formatowania ścieżki
Białe znaki (spacja, znak tabulacji) mogą być używane w segmentach notacji nawiasowej i wyrażeniach, na przykład: $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( ).
Ciągi znaków powinny być ujmowane w pojedyncze (') lub podwójne (") cudzysłowy.
Wewnątrz ciągów znaków pojedyncze lub podwójne cudzysłowy (w zależności od tego, które są używane do ich ujmowania) oraz ukośniki odwrotne (\) są poprzedzane znakiem ukośnika odwrotnego (\).
Przykład
{
"books": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Powiedzenia stulecia",
"price": 8.95,
"id": 1
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Miecz honoru",
"price": 12.99,
"id": 2
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99,
"id": 3
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "Władca Pierścieni",
"isbn": "0-395-19395-8",
"price": 22.99,
"id": 4
}
],
"services": {
"delivery": {
"servicegroup": 1000,
"description": "Dostawa następnego dnia na terenie lokalnego miasta",
"active": true,
"price": 5
},
"bookbinding": {
"servicegroup": 1001,
"description": "Druk i składanie książki w formacie A5",
"active": true,
"price": 154.99
},
"restoration": {
"servicegroup": 1002,
"description": "Różne metody renowacji",
"active": false,
"methods": [
{
"description": "Czyszczenie chemiczne",
"price": 46
},
{
"description": "Prasowanie stron uszkodzonych przez wilgoć",
"price": 24.5
},
{
"description": "Ponowne oprawienie rozdartej książki",
"price": 99.49
}
]
}
},
"filters": {
"price": 10,
"category": "fiction",
"no filters": "brak \"filtrów\""
},
"closed message": "Sklep jest zamknięty",
"tags": [
"a",
"b",
"c",
"d",
"e"
]
}
| JSONPath | Type | Wynik |
|---|---|---|
$.filters.price |
definite | 10 |
$.filters.category |
definite | fiction |
$.filters['no filters'] |
definite | brak "filtrów" |
$.filters |
definite | { "price": 10, "category": "fiction", "no filters": "brak \"filtrów\"" } |
$.books[1].title |
definite | Miecz honoru |
$.books[-1].author |
definite | J. R. R. Tolkien |
$.books.length() |
definite | 4 |
$.tags[:] |
indefinite | ["a", "b", "c", "d", "e" ] |
$.tags[2:] |
indefinite | ["c", "d", "e" ] |
$.tags[:3] |
indefinite | ["a", "b", "c"] |
$.tags[1:4] |
indefinite | ["b", "c", "d"] |
$.tags[-2:] |
indefinite | ["d", "e"] |
$.tags[:-3] |
indefinite | ["a", "b"] |
$.tags[:-3].length() |
definite | 2 |
$.books[0, 2].title |
indefinite | ["Moby Dick", "Powiedzenia stulecia"] |
$.books[1]['author', "title"] |
indefinite | ["Miecz honoru", "Evelyn Waugh"] |
$..id |
indefinite | [1, 2, 3, 4] |
$.services..price |
indefinite | [154.99, 5, 46, 24.5, 99.49] |
$.books[?(@.id == 4 - 0.4 * 5)].title |
indefinite | ["Miecz honoru"] Uwaga: To zapytanie pokazuje, że w zapytaniach można używać operacji arytmetycznych; można je uprościć do $.books[?(@.id == 2)].title |
$.books[?(@.id == 2 \|\| @.id == 4)].title |
indefinite | ["Miecz honoru", "Władca Pierścieni"] |
$.books[?(!(@.id == 2))].title |
indefinite | ["Powiedzenia stulecia", "Moby Dick", "Władca Pierścieni"] |
$.books[?(@.id != 2)].title |
indefinite | ["Powiedzenia stulecia", "Moby Dick", "Władca Pierścieni"] |
$.books[?(@.title =~ " of ")].title |
indefinite | ["Powiedzenia stulecia", "Miecz honoru", "Władca Pierścieni"] |
$.books[?(@.price > 12.99)].title |
indefinite | ["Władca Pierścieni"] |
$.books[?(@.author > "Herman Melville")].title |
indefinite | ["Powiedzenia stulecia", "Władca Pierścieni"] |
$.books[?(@.price > $.filters.price)].title |
indefinite | ["Miecz honoru", "Władca Pierścieni"] |
$.books[?(@.category == $.filters.category)].title |
indefinite | ["Miecz honoru","Moby Dick","Władca Pierścieni"] |
$.books[?(@.category == "fiction" && @.price < 10)].title |
indefinite | ["Moby Dick"] |
$..[?(@.id)] |
indefinite | [ { "price": 8.95, "id": 1, "category": "reference", "author": "Nigel Rees", "title": "Powiedzenia stulecia" }, { "price": 12.99, "id": 2, "category": "fiction", "author": "Evelyn Waugh", "title": "Miecz honoru" }, { "price": 8.99, "id": 3, "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3" }, { "price": 22.99, "id": 4, "category": "fiction", "author": "J. R. R. Tolkien", "title": "Władca Pierścieni", "isbn": "0-395-19395-8" } ] |
$.services..[?(@.price > 50)].description |
indefinite | ["Druk i składanie książki w formacie A5", "Ponowne oprawienie rozdartej książki"] |
$..id.length() |
definite | 4 |
$.books[?(@.id == 2)].title.first() |
definite | Miecz honoru |
$..tags.first().length() |
definite | 5 Uwaga: $..tags jest ścieżką indefinite, więc zwraca tablicę dopasowanych elementów, tj. [["a", "b", "c", "d", "e" ]]; first() zwraca pierwszy element, tj. ["a", "b", "c", "d", "e"]; length() oblicza długość elementu, tj. 5. |
$.books[*].price.min() |
definite | 8.95 |
$..price.max() |
definite | 154.99 |
$.books[?(@.category == "fiction")].price.avg() |
definite | 14.99 |
$.books[?(@.category == $.filters.xyz)].title |
indefinite | Uwaga: Zapytanie bez dopasowania zwraca NULL dla ścieżek definite i indefinite. |
$.services[?(@.active=="true")].servicegroup |
indefinite | [1001,1000] Uwaga: W porównaniach wartości logicznych należy używać stałych tekstowych. |
$.services[?(@.active=="false")].servicegroup |
indefinite | [1002] Uwaga: W porównaniach wartości logicznych należy używać stałych tekstowych. |
$.services[?(@.servicegroup=="1002")]~.first() |
definite | restoration |