[comment]: # ({ece5d44c-16d8a00a})
# 4 Funkcjonalność JSONPath

[comment]: # ({/ece5d44c-16d8a00a})

[comment]: # ({aac69794-a806c032})
#### 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](/manual/config/items/preprocessing/jsonpath_functionality/escaping_lld_macros).

[comment]: # ({/aac69794-a806c032})

[comment]: # ({1298c5a2-74fc1571})
#### 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:<br>**<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;<br>**<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.

[comment]: # ({/1298c5a2-74fc1571})

[comment]: # ({67ca5f43-5eac028e})
#### Wyrażenie filtra

Wyrażenie filtra jest wyrażeniem arytmetycznym w notacji infiksowej.

Obsługiwane operandy:

|Operand|Opis|
|---|-------|
|`"<text>"`<br>`'<text>'`|Stała tekstowa.<br><br>Przykład:<br>`'value: \\'1\\''`<br>`"value: '1'"`|
|`<number>`|Stała liczbowa obsługująca notację naukową.<br><br>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.<br><br>Przykład: `$.object.name`|
|`<jsonpath starting with @>`|Wartość wskazywana przez JSONPath od bieżącego obiektu/elementu; obsługiwane są tylko ścieżki jednoznaczne.<br><br>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)|

[comment]: # ({/67ca5f43-5eac028e})

[comment]: # ({8c75d01d-b66eb391})
#### 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ę.

[comment]: # ({/8c75d01d-b66eb391})

[comment]: # ({e739c583-729c09d6})
#### 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.

::: noteimportant
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.
:::

[comment]: # ({/e739c583-729c09d6})

[comment]: # ({b5105ad4-5f0aac44})
#### 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 (`\`).

[comment]: # ({/b5105ad4-5f0aac44})

[comment]: # ({f476ebb9-4c860844})
#### Przykład

[comment]: # ({/f476ebb9-4c860844})

[comment]: # ({b5257e6a-93072157})
```json
{
  "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|{<br>"price": 10,<br>"category": "fiction",<br>"no filters": "brak \\"filtrów\\""<br>}|
|`$.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"\]<br><br>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|\[<br>{<br>"price": 8.95,<br>"id": 1,<br>"category": "reference",<br>"author": "Nigel Rees",<br>"title": "Powiedzenia stulecia"<br>},<br>{<br>"price": 12.99,<br>"id": 2,<br>"category": "fiction",<br>"author": "Evelyn Waugh",<br>"title": "Miecz honoru"<br>},<br>{<br>"price": 8.99,<br>"id": 3,<br>"category": "fiction",<br>"author": "Herman Melville",<br>"title": "Moby Dick",<br>"isbn": "0-553-21311-3"<br>},<br>{<br>"price": 22.99,<br>"id": 4,<br>"category": "fiction",<br>"author": "J. R. R. Tolkien",<br>"title": "Władca Pierścieni",<br>"isbn": "0-395-19395-8"<br>}<br>\]|
|`$.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<br><br>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\]<br><br>Uwaga: W porównaniach wartości logicznych należy używać stałych tekstowych.|
|`$.services[?(@.active=="false")].servicegroup`|indefinite|\[1002\]<br><br>Uwaga: W porównaniach wartości logicznych należy używać stałych tekstowych.|
|`$.services[?(@.servicegroup=="1002")]~.first()`|definite|restoration|

[comment]: # ({/b5257e6a-93072157})
