3 JSONPath functionaliteit

Overzicht

Deze sectie geeft details over de ondersteunde JSONPath-functionaliteit in de stappen voor voorbewerking van itemwaarden.

JSONPath bestaat uit segmenten die worden gescheiden door punten. Een segment kan een eenvoudig woord zijn zoals een JSON-waardenaam, * of een complexere constructie die wordt ingesloten in vierkante haken [ ]. Het scheidende punt vóór het hokje-segment is optioneel en kan worden weggelaten. Bijvoorbeeld:

Pad Beschrijving
$.object.name Geeft de inhoud van object.name terug.
$.object['name'] Geeft de inhoud van object.name terug.
$.object.['name'] Geeft de inhoud van object.name terug.
$["object"]['name'] Geeft de inhoud van object.name terug.
$.['object'].["name"] Geeft de inhoud van object.name terug.
$.object.history.length() Geeft het aantal elementen in de array object.history terug.
$[?(@.name == 'Object')].price.first() Geeft het prijsveld van het eerste object met de naam 'Object' terug.
$[?(@.name == 'Object')].history.first().length() Geeft het aantal elementen in de geschiedenisarray van het eerste object met de naam 'Object' terug.
$[?(@.price > 10)].length() Geeft het aantal objecten terug waarvan de prijs groter is dan 10.

Zie ook: Speciale tekens ontsnappen uit LLD-macrowaarden in JSONPath.

Ondersteunde segmenten

Segment Beschrijving
<name> Overeenkomen met een objecteigenschap op naam.
* Overeenkomen met alle objecteigenschappen.
['<name>'] Overeenkomen met een objecteigenschap op naam.
['<name>', '<name>', ...] Overeenkomen met een objecteigenschap op een van de opgegeven namen.
[<index>] Overeenkomen met een array-element op basis van de index.
[<number>, <number>, ...] Overeenkomen met een array-element op basis van een van de opgegeven indexes.
[*] Overeenkomen met alle objecteigenschappen of array-elementen.
[<start>:<end>] Overeenkomen met array-elementen op basis van het opgegeven bereik:
<start> - de eerste index om overeen te komen (inbegrepen). Indien niet gespecificeerd, komen alle array-elementen vanaf het begin overeen. Indien negatief, geeft het een startverschuiving vanaf het einde van de array aan.
<end> - de laatste index om overeen te komen (uitgesloten). Indien niet gespecificeerd, komen alle array-elementen overeen tot het einde. Indien negatief, geeft het een startverschuiving vanaf het einde van de array aan.
[?(<expression>)] Overeenkomen met objecten/array-elementen door een filterexpressie toe te passen.

Om een overeenkomend segment te vinden zonder rekening te houden met de hiërarchie ervan (losgekoppeld segment), moet het worden voorafgegaan door '..' , bijvoorbeeld $..name of $..['name'] geeft waarden terug van alle 'name'-eigenschappen.

Overeenkomende elementnamen kunnen worden geëxtraheerd door een ~ achtervoegsel toe te voegen aan de JSONPath. Hiermee wordt de naam van het overeenkomende object of een index in stringformaat van het overeenkomende array-item geretourneerd. De uitvoerindeling volgt dezelfde regels als andere JSONPath-query's - definitieve padresultaten worden 'zoals ze zijn' geretourneerd en onbepaalde padresultaten worden als array geretourneerd. Er is echter weinig nut om de naam van een element dat overeenkomt met een definitief pad, te extraheren - deze is immers al bekend.

Filterexpressie

De filterexpressie is een arithmetische uitdrukking in infixnotatie.

Ondersteunde operanden:

Operand Beschrijving Voorbeeld
"<text>"
'<text>'
Tekstconstante. 'value: \'1\''
"value: '1'"
<number> Numerieke constante die wetenschappelijke notatie ondersteunt. 123
<jsonpath die begint met $> Waarde waarnaar wordt verwezen door de JSONPath vanuit de wortelknoop van het invoegdocument; alleen definitieve paden worden ondersteund. $.object.name
<jsonpath die begint met @> Waarde waarnaar wordt verwezen door de JSONPath vanuit het huidige object/element; alleen definitieve paden worden ondersteund. @.name

Ondersteunde operatoren:

Operator Type Beschrijving Resultaat
- binaire Aftrekking. Getal.
+ binaire Optelling. Getal.
/ binaire Deling. Getal.
* binaire Vermenigvuldiging. Getal.
== binaire Is gelijk aan. Boolean (1 of 0).
!= binaire Is niet gelijk aan. Boolean (1 of 0).
< binaire Is kleiner dan. Boolean (1 of 0).
<= binaire Is kleiner dan of gelijk aan. Boolean (1 of 0).
> binaire Is groter dan. Boolean (1 of 0).
>= binaire Is groter dan of gelijk aan. Boolean (1 of 0).
=~ binaire Komt overeen met reguliere expressie. Boolean (1 of 0).
! unaire Boolean not. Boolean (1 of 0).
|| binaire Boolean or. Boolean (1 of 0).
&& binaire Boolean and. Boolean (1 of 0).

Functies

Functies kunnen aan het einde van JSONPath worden gebruikt. Meerdere functies kunnen worden gekoppeld als de voorgaande functie een waarde retourneert die wordt geaccepteerd door de volgende functie.

Ondersteunde functies:

Functie Beschrijving Invoer Uitvoer
avg Gemiddelde waarde van getallen in invoerarray. Array van getallen. Getal.
min Minimale waarde van getallen in invoerarray. Array van getallen. Getal.
max Maximale waarde van getallen in invoerarray. Array van getallen. Getal.
sum Som van getallen in invoerarray. Array van getallen. Getal.
length Aantal elementen in invoerarray. Array. Getal.
first Het eerste element van de array. Array. Een JSON-constructie (object, array, waarde) afhankelijk van de inhoud van de invoerarray.

Tussen aanhalingstekens geplaatste numerieke waarden worden geaccepteerd door de JSONPath-aggregatiefuncties. Dit betekent dat de waarden van het tekenreeptype naar numeriek worden geconverteerd als aggregatie vereist is.

Incompatibele invoer zal de functie een fout laten genereren.

Uitvoerwaarde

JSON-paden kunnen worden verdeeld in definitieve en onbepaalde paden. Een definitief pad kan alleen null of een enkele overeenkomst retourneren. Een onbepaald pad kan meerdere overeenkomsten retourneren, in wezen JSON-paden met losgekoppelde, meerdere namen/indexlijst, array-slice of expressie-segmenten. Echter, wanneer een functie wordt gebruikt, wordt het JSON-pad definitief, omdat functies altijd een enkele waarde uitvoeren.

Een definitief pad retourneert het object/array/waarde waarnaar wordt verwezen, terwijl een onbepaald pad een array retourneert van de overeenkomende objecten/arrays/waarden.

De volgorde van eigenschappen in de resultaten van JSONPath-query's kan niet overeenkomen met de oorspronkelijke JSON-eigenschapsvolgorde vanwege interne optimalisatiemethoden. Bijvoorbeeld, het JSON-pad $.boeken[1]["auteur", "titel"] kan [ "titel", "auteur"] retourneren. Als het behouden van de oorspronkelijke eigenschapsvolgorde essentieel is, moeten alternatieve methoden voor het verwerken van de queryresultaten worden overwogen.

Witruimte

Witruimte (spaties, tabtekens) kan vrij worden gebruikt in segmenten van de vierkante haakjes-notatie en expressies, bijvoorbeeld, $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( ).

Tekst

Teksten moeten worden omsloten met enkele ' of dubbele " aanhalingstekens. Binnen de teksten worden enkele of dubbele aanhalingstekens (afhankelijk van welke worden gebruikt om het te omsluiten) en schuine strepen \ geëscaped met het schuine streep \ teken.

Voorbeelden

Invoergegevens
{
         "books": [
           {
             "category": "reference",
             "author": "Nigel Rees",
             "title": "Sayings of the Century",
             "price": 8.95,
             "id": 1
           },
           {
             "category": "fiction",
             "author": "Evelyn Waugh",
             "title": "Sword of Honour",
             "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": "The Lord of the Rings",
             "isbn": "0-395-19395-8",
             "price": 22.99,
             "id": 4
           }
         ],
         "services": {
           "delivery": {
             "servicegroup": 1000,
             "description": "Next day delivery in local town",
             "active": true,
             "price": 5
           },
           "bookbinding": {
             "servicegroup": 1001,
             "description": "Printing and assembling book in A5 format",
             "active": true,
             "price": 154.99
           },
           "restoration": {
             "servicegroup": 1002,
             "description": "Various restoration methods",
             "active": false,
             "methods": [
               {
                 "description": "Chemical cleaning",
                 "price": 46
               },
               {
                 "description": "Pressing pages damaged by moisture",
                 "price": 24.5
               },
               {
                 "description": "Rebinding torn book",
                 "price": 99.49
               }
             ]
           }
         },
         "filters": {
           "price": 10,
           "category": "fiction",
           "no filters": "no \"filters\""
         },
         "closed message": "Store is closed",
         "tags": [
           "a",
           "b",
           "c",
           "d",
           "e"
         ]
       }
JSONPath Type Result Opmerkingen
$.filters.price definite 10
$.filters.category definite fiction
$.filters['no filters'] definite no "filters"
$.filters definite {
"price": 10,
"category": "fiction",
"no filters": "no \"filters\""
}
$.books[1].title definite Sword of Honour
$.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", "Sayings of the Century"]
$.books[1]['author', "title"] indefinite ["Sword of Honour", "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 ["Sword of Honour"] Deze query toont aan dat wiskundige operaties kunnen worden gebruikt in query's. Natuurlijk kan deze query worden vereenvoudigd tot $.books[?(@.id == 2)].title
$.books[?(@.id == 2 \|\| @.id == 4)].title indefinite ["Sword of Honour", "The Lord of the Rings"]
$.books[?(!(@.id == 2))].title indefinite ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"]
$.books[?(@.id != 2)].title indefinite ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"]
$.books[?(@.title =~ " of ")].title indefinite ["Sayings of the Century", "Sword of Honour", "The Lord of the Rings"]
$.books[?(@.price > 12.99)].title indefinite ["The Lord of the Rings"]
$.books[?(@.author > "Herman Melville")].title indefinite ["Sayings of the Century", "The Lord of the Rings"]
$.books[?(@.price > $.filters.price)].title indefinite ["Sword of Honour", "The Lord of the Rings"]
$.books[?(@.category == $.filters.category)].title indefinite ["Sword of Honour","Moby Dick","The Lord of the Rings"]
$.books[?(@.category == "fiction" && @.price < 10)].title indefinite ["Moby Dick"]
$..[?(@.id)] indefinite [
{
"price": 8.95,
"id": 1,
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century"
},
{
"price": 12.99,
"id": 2,
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour"
},
{
"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": "The Lord of the Rings",
"isbn": "0-395-19395-8"
}
]
$.services..[?(@.price > 50)].description indefinite '["Printing and assembling book in A5 format", "Rebinding torn book"]
$..id.length() definite 4
$.books[?(@.id == 2)].title.first() definite Sword of Honour
$..tags.first().length() definite 5 $..tags is een onbepaald pad, dus het retourneert een array van overeenkomende elementen - [["a", "b", "c", "d", "e" ]], first() retourneert het eerste element - ["a", "b", "c", "d", "e" ] en tot slot berekent length() de lengte - 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 Een query zonder overeenkomst retourneert NULL voor zowel definitieve als onbepaalde paden.
$.services[?(@.active=="true")].servicegroup indefinite [1001,1000] Tekstconstantes moeten worden gebruikt in vergelijkingen met booleaanse waarden.
$.services[?(@.active=="false")].servicegroup indefinite [1002] Tekstconstantes moeten worden gebruikt in vergelijkingen met booleaanse waarden.
$.services[?(@.servicegroup=="1002")]~.first() definite restoration