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