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