4 JSONPath funkcionalitāte
Pārskats
Šajā sadaļā ir aprakstīta atbalstītā JSONPath funkcionalitāte vienuma vērtības priekšapstrādes soļos.
JSONPath sastāv no segmentiem, kas atdalīti ar punktiem.
Segments var būt vienkāršs vārds, kas apzīmē JSON vērtības nosaukumu, aizstājējzīme (*) vai sarežģītāka konstrukcija kvadrātiekavās.
Punkts pirms segmenta kvadrātiekavās nav obligāts, un to var izlaist.
| JSONPath example | Apraksts |
|---|---|
$.object.name |
Atgriež object.name saturu. |
$.object['name'] |
Atgriež object.name saturu. |
$.object.['name'] |
Atgriež object.name saturu. |
$["object"]['name'] |
Atgriež object.name saturu. |
$.['object'].["name"] |
Atgriež object.name saturu. |
$.object.history.length() |
Atgriež object.history masīva elementu skaitu. |
$[?(@.name == 'Object')].price.first() |
Atgriež rekvizīta price vērtību no pirmā objekta ar nosaukumu "Object". |
$[?(@.name == 'Object')].history.first().length() |
Atgriež vēstures masīva elementu skaitu no pirmā objekta ar nosaukumu "Object". |
$[?(@.price > 10)].length() |
Atgriež objektu skaitu, kuru cena ir lielāka par 10. |
Skatiet arī: Speciālo rakstzīmju atsoļošana no LLD makro vērtībām JSONPath izteiksmēs.
Atbalstītie segmenti
| Segments | Apraksts |
|---|---|
<name> |
Atbilst objekta īpašībai pēc nosaukuma. |
* |
Atbilst visām objekta īpašībām. |
['<name>'] |
Atbilst objekta īpašībai pēc nosaukuma. |
['<name>', '<name>', ...] |
Atbilst objekta īpašībai pēc jebkura no uzskaitītajiem nosaukumiem. |
[<index>] |
Atbilst masīva elementam pēc indeksa. |
[<number>, <number>, ...] |
Atbilst masīva elementam pēc jebkura no uzskaitītajiem indeksiem. |
[*] |
Atbilst visām objekta īpašībām vai masīva elementiem. |
[<start>:<end>] |
Atbilst masīva elementiem pēc norādītā diapazona: <start> - pirmais indekss, kam jāatbilst (ieskaitot); ja nav norādīts, atbilst visiem masīva elementiem no sākuma; ja ir negatīvs, norāda sākuma nobīdi no masīva beigām; <end> - pēdējais indekss, kam jāatbilst (neieskaitot); ja nav norādīts, atbilst visiem masīva elementiem līdz beigām; ja ir negatīvs, norāda sākuma nobīdi no masīva beigām. |
[?(<expression>)] |
Atbilst objektiem/masīva elementiem, piemērojot filtra izteiksmi. |
Lai atrastu atbilstošu segmentu, ignorējot tā izcelsmi (atdalīts segments), tam jāpievieno prefikss ar diviem punktiem (..).
Piemēram, $..name vai $..['name'] atgriež visu name īpašību vērtības.
Atbilstošo elementu nosaukumus var iegūt, JSONPath pievienojot sufiksu ar tildi (~).
Tas atgriež atbilstošā objekta nosaukumu vai atbilstošā masīva vienuma indeksu virknes formātā.
Izvades formāts ievēro tos pašus noteikumus kā citiem JSONPath vaicājumiem — noteikta ceļa rezultāti tiek atgriezti "kā ir", bet nenoteikta ceļa rezultāti tiek atgriezti masīvā.
Tomēr elementa nosaukuma iegūšanai, kas atbilst noteiktam ceļam, ir maza praktiska vērtība, jo tas jau ir zināms.
Filtra izteiksme
Filtra izteiksme ir aritmētiska izteiksme infiksa pierakstā.
Atbalstītie operandi:
| Operands | Apraksts |
|---|---|
"<text>"'<text>' |
Teksta konstante. Piemērs: 'value: \\'1\\''"value: '1'" |
<number> |
Skaitliska konstante ar zinātniskā pieraksta atbalstu. Piemērs: 123 |
<jsonpath starting with $> |
Vērtība, uz kuru norāda JSONPath no ievades dokumenta saknes mezgla; tiek atbalstīti tikai noteiktie ceļi. Piemērs: $.object.name |
<jsonpath starting with @> |
Vērtība, uz kuru norāda JSONPath no pašreizējā objekta/elementa; tiek atbalstīti tikai noteiktie ceļi. Piemērs: @.name |
Atbalstītie operatori:
| Operators | Tips | Apraksts | Rezultāts |
|---|---|---|---|
- |
Binārs | Atņemšana | Skaitlis |
+ |
Binārs | Saskaitīšana | Skaitlis |
/ |
Binārs | Dalīšana | Skaitlis |
* |
Binārs | Reizināšana | Skaitlis |
== |
Binārs | Vienādība | Būla vērtība (1/0) |
!= |
Binārs | Nevienādība | Būla vērtība (1/0) |
< |
Binārs | Mazāks par | Būla vērtība (1/0) |
<= |
Binārs | Mazāks par vai vienāds ar | Būla vērtība (1/0) |
> |
Binārs | Lielāks par | Būla vērtība (1/0) |
>= |
Binārs | Lielāks par vai vienāds ar | Būla vērtība (1/0) |
=~ |
Binārs | Atbilst regulārajai izteiksmei | Būla vērtība (1/0) |
! |
Unārs | Būla NOT | Būla vērtība (1/0) |
|| |
Binārs | Būla OR | Būla vērtība (1/0) |
&& |
Binārs | Būla AND | Būla vērtība (1/0) |
Funkcijas
Funkcijas var izmantot JSONPath beigās. Var sasaistīt vairākas funkcijas, ja iepriekšējā funkcija atgriež vērtību, ko pieņem nākamā funkcija.
Atbalstītās funkcijas:
| Function | Description | Input | Output |
|---|---|---|---|
avg |
Skaitļu vidējā vērtība ievades masīvā | Skaitļu masīvs | Skaitlis |
min |
Skaitļu minimālā vērtība ievades masīvā | Skaitļu masīvs | Skaitlis |
max |
Skaitļu maksimālā vērtība ievades masīvā | Skaitļu masīvs | Skaitlis |
sum |
Skaitļu summa ievades masīvā | Skaitļu masīvs | Skaitlis |
length |
Elementu skaits ievades masīvā | Masīvs | Skaitlis |
first |
Masīva pirmais elements | Masīvs | JSON konstrukcija (objekts, masīvs, vērtība) atkarībā no ievades masīva satura |
JSONPath agregācijas funkcijas pieņem skaitliskas vērtības pēdiņās. Šīs vērtības tiek automātiski pārveidotas no virknēm uz skaitliskiem tipiem, kad nepieciešama agregācija. Nesaderīga ievade izraisīs funkcijas kļūdu.
Izvades vērtība
JSONPath var iedalīt noteiktos un nenoteiktos ceļos. Noteikts ceļš var atgriezt tikai null vai vienu atbilstību. Nenoteikts ceļš var atgriezt vairākas atbilstības: JSONPath ar atdalītiem, vairāku nosaukumu/indeksu sarakstiem, masīva izgriezumiem vai izteiksmju segmentiem. Tomēr, ja tiek izmantota funkcija, JSONPath kļūst noteikts, jo funkcijas vienmēr izvada vienu vērtību.
Noteikts ceļš atgriež objektu/masīvu/vērtību, uz kuru tas atsaucas. Savukārt nenoteikts ceļš atgriež masīvu ar atbilstošajiem objektiem/masīviem/vērtībām.
Īpašību secība JSONPath vaicājuma rezultātos var nesakrist ar sākotnējo JSON īpašību secību iekšējo optimizācijas metožu dēļ.
Piemēram, JSONPath $.books[1]["author", "title"] var atgriezt ["title", "author"].
Ja ir būtiski saglabāt sākotnējo īpašību secību, jāapsver alternatīvas pēcapstrādes metodes pēc vaicājuma izpildes.
Ceļa formatēšanas noteikumi
Atstarpes (atstarpes, tabulācijas rakstzīmes) var izmantot iekavu notācijas segmentos un izteiksmēs, piemēram: $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( ).
Virknes jāiekļauj vienpēdiņās (') vai dubultpēdiņās (").
Virkņu iekšpusē vienpēdiņas vai dubultpēdiņas (atkarībā no tā, kuras tiek izmantotas to ietveršanai) un atpakaļvērstās slīpsvītras (\) tiek atdalītas ar atpakaļvērstās slīpsvītras (\) rakstzīmi.
Piemērs
{
"books": [
{
"category": "uzziņu literatūra",
"author": "Nigel Rees",
"title": "Gadsimta teicieni",
"price": 8.95,
"id": 1
},
{
"category": "daiļliteratūra",
"author": "Evelyn Waugh",
"title": "Goda zobens",
"price": 12.99,
"id": 2
},
{
"category": "daiļliteratūra",
"author": "Herman Melville",
"title": "Mobijs Diks",
"isbn": "0-553-21311-3",
"price": 8.99,
"id": 3
},
{
"category": "daiļliteratūra",
"author": "J. R. R. Tolkien",
"title": "Gredzenu pavēlnieks",
"isbn": "0-395-19395-8",
"price": 22.99,
"id": 4
}
],
"services": {
"delivery": {
"servicegroup": 1000,
"description": "Piegāde nākamajā dienā vietējā pilsētā",
"active": true,
"price": 5
},
"bookbinding": {
"servicegroup": 1001,
"description": "Grāmatas drukāšana un salikšana A5 formātā",
"active": true,
"price": 154.99
},
"restoration": {
"servicegroup": 1002,
"description": "Dažādas restaurācijas metodes",
"active": false,
"methods": [
{
"description": "Ķīmiskā tīrīšana",
"price": 46
},
{
"description": "Mitruma bojātu lapu presēšana",
"price": 24.5
},
{
"description": "Saplēstas grāmatas pārsiešana",
"price": 99.49
}
]
}
},
"filters": {
"price": 10,
"category": "daiļliteratūra",
"no filters": "nav \"filtru\""
},
"closed message": "Veikals ir slēgts",
"tags": [
"a",
"b",
"c",
"d",
"e"
]
}
| JSONPath | Type | Result |
|---|---|---|
$.filters.price |
definite | 10 |
$.filters.category |
definite | daiļliteratūra |
$.filters['no filters'] |
definite | nav "filtru" |
$.filters |
definite | { "price": 10, "category": "daiļliteratūra", "no filters": "nav \"filtru\"" } |
$.books[1].title |
definite | Goda zobens |
$.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 | ["Mobijs Diks", "Gadsimta teicieni"] |
$.books[1]['author', "title"] |
indefinite | ["Goda zobens", "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 | ["Goda zobens"] Piezīme: Šis vaicājums parāda, ka vaicājumos var izmantot aritmētiskās darbības; to var vienkāršot līdz $.books[?(@.id == 2)].title |
$.books[?(@.id == 2 \|\| @.id == 4)].title |
indefinite | ["Goda zobens", "Gredzenu pavēlnieks"] |
$.books[?(!(@.id == 2))].title |
indefinite | ["Gadsimta teicieni", "Mobijs Diks", "Gredzenu pavēlnieks"] |
$.books[?(@.id != 2)].title |
indefinite | ["Gadsimta teicieni", "Mobijs Diks", "Gredzenu pavēlnieks"] |
$.books[?(@.title =~ " of ")].title |
indefinite | ["Gadsimta teicieni", "Goda zobens", "Gredzenu pavēlnieks"] |
$.books[?(@.price > 12.99)].title |
indefinite | ["Gredzenu pavēlnieks"] |
$.books[?(@.author > "Herman Melville")].title |
indefinite | ["Gadsimta teicieni", "Gredzenu pavēlnieks"] |
$.books[?(@.price > $.filters.price)].title |
indefinite | ["Goda zobens", "Gredzenu pavēlnieks"] |
$.books[?(@.category == $.filters.category)].title |
indefinite | ["Goda zobens","Mobijs Diks","Gredzenu pavēlnieks"] |
$.books[?(@.category == "fiction" && @.price < 10)].title |
indefinite | ["Mobijs Diks"] |
$..[?(@.id)] |
indefinite | [ { "price": 8.95, "id": 1, "category": "uzziņu literatūra", "author": "Nigel Rees", "title": "Gadsimta teicieni" }, { "price": 12.99, "id": 2, "category": "daiļliteratūra", "author": "Evelyn Waugh", "title": "Goda zobens" }, { "price": 8.99, "id": 3, "category": "daiļliteratūra", "author": "Herman Melville", "title": "Mobijs Diks", "isbn": "0-553-21311-3" }, { "price": 22.99, "id": 4, "category": "daiļliteratūra", "author": "J. R. R. Tolkien", "title": "Gredzenu pavēlnieks", "isbn": "0-395-19395-8" } ] |
$.services..[?(@.price > 50)].description |
indefinite | ["Grāmatas drukāšana un salikšana A5 formātā", "Saplēstas grāmatas pārsiešana"] |
$..id.length() |
definite | 4 |
$.books[?(@.id == 2)].title.first() |
definite | Goda zobens |
$..tags.first().length() |
definite | 5 Piezīme: $..tags ir nenoteikts ceļš, tāpēc tas atgriež atbilstošo elementu masīvu, t. i., [["a", "b", "c", "d", "e" ]]; first() atgriež pirmo elementu, t. i., ["a", "b", "c", "d", "e"]; length() aprēķina elementa garumu, t. i., 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 | Piezīme: Vaicājums bez atbilstības atgriež NULL noteiktiem un nenoteiktiem ceļiem. |
$.services[?(@.active=="true")].servicegroup |
indefinite | [1001,1000] Piezīme: Salīdzinājumos ar Būla vērtībām jāizmanto teksta konstantes. |
$.services[?(@.active=="false")].servicegroup |
indefinite | [1002] Piezīme: Salīdzinājumos ar Būla vērtībām jāizmanto teksta konstantes. |
$.services[?(@.servicegroup=="1002")]~.first() |
definite | restoration |