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:
| Operand | Apraksts |
|---|---|
"<text>"'<text>' |
Teksta konstante. Piemērs: 'value: \'1\''"value: '1'" |
<number> |
Skaitliska konstante ar zinātnisko pierakstu. Piemērs: 123 |
<jsonpath starting with $> |
Vērtība, uz kuru norāda JSONPath no ievades dokumenta saknes mezgla; tiek atbalstīti tikai noteikti 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 noteikti ceļi. Piemērs: @.name |
Atbalstītie operatori:
| Operators | Tips | Apraksts | Rezultāts |
|---|---|---|---|
- |
Binary | Atņemšana | Skaitlis |
+ |
Binary | Saskaitīšana | Skaitlis |
/ |
Binary | Dalīšana | Skaitlis |
* |
Binary | Reizināšana | Skaitlis |
== |
Binary | Vienādība | Būla vērtība (1/0) |
!= |
Binary | Nevienādība | Būla vērtība (1/0) |
< |
Binary | Mazāks par | Būla vērtība (1/0) |
<= |
Binary | Mazāks vai vienāds ar | Būla vērtība (1/0) |
> |
Binary | Lielāks par | Būla vērtība (1/0) |
>= |
Binary | Lielāks vai vienāds ar | Būla vērtība (1/0) |
=~ |
Binary | Atbilst regulārajai izteiksmei | Būla vērtība (1/0) |
! |
Unary | Būla NOT | Būla vērtība (1/0) |
|| |
Binary | Būla OR | Būla vērtība (1/0) |
&& |
Binary | 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": "reference",
"author": "Nigel Rees",
"title": "Century teicieni",
"price": 8.95,
"id": 1
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Goda zobens",
"price": 12.99,
"id": 2
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Mobijs Diks",
"isbn": "0-553-21311-3",
"price": 8.99,
"id": 3
},
{
"category": "fiction",
"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": "Ar mitrumu bojātu lapu presēšana",
"price": 24.5
},
{
"description": "Saplēstas grāmatas pārsiešana",
"price": 99.49
}
]
}
},
"filters": {
"price": 10,
"category": "fiction",
"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 | fiction |
$.filters['no filters'] |
definite | nav "filtru" |
$.filters |
definite | { "price": 10, "category": "fiction", "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", "Century 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 | ["Century teicieni", "Mobijs Diks", "Gredzenu pavēlnieks"] |
$.books[?(@.id != 2)].title |
indefinite | ["Century teicieni", "Mobijs Diks", "Gredzenu pavēlnieks"] |
$.books[?(@.title =~ " of ")].title |
indefinite | ["Century teicieni", "Goda zobens", "Gredzenu pavēlnieks"] |
$.books[?(@.price > 12.99)].title |
indefinite | ["Gredzenu pavēlnieks"] |
$.books[?(@.author > "Herman Melville")].title |
indefinite | ["Century 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": "reference", "author": "Nigel Rees", "title": "Century teicieni" }, { "price": 12.99, "id": 2, "category": "fiction", "author": "Evelyn Waugh", "title": "Goda zobens" }, { "price": 8.99, "id": 3, "category": "fiction", "author": "Herman Melville", "title": "Mobijs Diks", "isbn": "0-553-21311-3" }, { "price": 22.99, "id": 4, "category": "fiction", "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 gan noteiktiem, gan nenoteiktiem ceļiem. |
$.services[?(@.active=="true")].servicegroup |
indefinite | [1001,1000] Piezīme: Teksta konstantes ir jāizmanto, salīdzinot loģiskās vērtības. |
$.services[?(@.active=="false")].servicegroup |
indefinite | [1002] Piezīme: Teksta konstantes ir jāizmanto, salīdzinot loģiskās vērtības. |
$.services[?(@.servicegroup=="1002")]~.first() |
definite | restoration |