3 JSONPath functionaliteit

Overzicht

Deze sectie geeft details weer van de ondersteunde JSONPath-functionaliteit in stappen voorafgaand aan de bewerking van itemwaarden.

JSONPath bestaat uit segmenten die gescheiden zijn door punten. Een segment kan ofwel een eenvoudig woord zijn, zoals een JSON-waardenaam, *, of een complexere constructie die is ingesloten in vierkante haken [ ]. Het scheidingsteken punt voor een segment met haakjes is optioneel en kan worden weggelaten. Bijvoorbeeld:

Pad Omschrijving
$.object.name Geef de inhoud van object.name terug.
$.object['name'] Geef de inhoud van object.name terug.
$.object.['name'] Geef de inhoud van object.name terug.
$["object"]['name'] Geef de inhoud van object.name terug.
$.['object'].["name"] Geef de inhoud van object.name terug.
$.object.history.length() Geef het aantal elementen in de array object.history terug.
$[?(@.name == 'Object')].price.first() Geef het prijsveld van het eerste object met de naam 'Object' terug.
$[?(@.name == 'Object')].history.first().length() Geef het aantal elementen in de array history van het eerste object met de naam 'Object' terug.
$[?(@.price > 10)].length() Geef het aantal objecten terug met een prijs hoger dan 10.

Zie ook: Ontsnappen aan speciale tekens in LLD-macrowaarden in JSONPath.

Ondersteunde segmenten

Segment Omschrijving
<naam> Match objecteigenschap op basis van naam.
* Match alle objecteigenschappen.
['<naam>'] Match objecteigenschap op basis van naam.
['<naam>', '<naam>', ...] Match objecteigenschap op basis van een van de opgegeven namen.
[<index>] Match array-element op basis van de index.
[<getal>, <getal>, ...] Match array-element op basis van een van de opgegeven indexen.
[*] Match alle objecteigenschappen of array-elementen.
[<start>:<einde>] Match array-elementen op basis van het gedefinieerde bereik:
<start> - de eerste index om overeen te komen (inclusief). Indien niet gespecificeerd, worden alle array-elementen vanaf het begin overeenkomend. Als negatief, specificeert het een start-offset vanaf het einde van de array.
<einde> - de laatste index om overeen te komen (exclusief). Indien niet gespecificeerd, worden alle array-elementen overeenkomend tot het einde. Als negatief, specificeert het een start-offset vanaf het einde van de array.
[?(<uitdrukking>)] Match objecten/array-elementen door een filteruitdrukking toe te passen.

Om een overeenkomend segment te vinden en de hiërarchie te negeren (losgemaakt segment), moet het worden voorafgegaan door '..' , bijvoorbeeld $..name of $..['name'] retourneert waarden van alle 'name' eigenschappen.

Overeenkomende elementnamen kunnen worden geëxtraheerd door een ~-achtervoegsel toe te voegen aan de JSONPath. Het retourneert de naam van het overeenkomende object of een index in stringformaat van het overeenkomende array-item. De outputindeling volgt dezelfde regels als andere JSONPath-zoekopdrachten - definitieve padresultaten worden 'as is' geretourneerd en onbepaalde padresultaten worden in een array geretourneerd. Er is echter niet veel nut in het extraheren van de naam van een element dat overeenkomt met een definitief pad - dat is al bekend.

Filteruitdrukking

De filteruitdrukking is een rekenkundige expressie in infixnotatie.

Ondersteunde operanden:

Operand Omschrijving Voorbeeld
"<tekst>"
'<tekst>'
Tekstconstante. 'waarde: \'1\''
"waarde: '1'"
<getal> Numerieke constante met ondersteuning voor wetenschappelijke notatie. 123
<jsonpad beginnend met $> Waarde waarnaar wordt verwezen door de JSONPath vanaf de root-node van het invoegdocument; alleen definitieve paden worden ondersteund. $.object.name
<jsonpad beginnend met @> Waarde waarnaar wordt verwezen door de JSONPath vanaf het huidige object/element; alleen definitieve paden worden ondersteund. @.name

Ondersteunde operatoren:

Operator Type Omschrijving Resultaat
- binair Aftrekking. Getal.
+ binair Optelling. Getal.
/ binair Deling. Getal.
* binair Vermenigvuldiging. Getal.
== binair Is gelijk aan. Boolean (1 of 0).
!= binair Is niet gelijk aan. Boolean (1 of 0).
< binair Is kleiner dan. Boolean (1 of 0).
<= binair Is kleiner dan of gelijk aan. Boolean (1 of 0).
> binair Is groter dan. Boolean (1 of 0).
>= binair Is groter dan of gelijk aan. Boolean (1 of 0).
=~ binair Komt overeen met reguliere expressie. Boolean (1 of 0).
! unaire Logische negatie. Boolean (1 of 0).
|| binair Logische OR. Boolean (1 of 0).
&& binair Logische EN. 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

Invoerdata
{
         "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 Resultaat 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 laat zien dat wiskundige bewerkingen 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 ten slotte berekent length() de lengte ervan - 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] Tekstconstanten moeten worden gebruikt in vergelijkingen van booleaanse waarden.
$.services[?(@.active=="false")].servicegroup indefinite [1002] Tekstconstanten moeten worden gebruikt in vergelijkingen van booleaanse waarden.
$.services[?(@.servicegroup=="1002")]~.first() definite restoration