4 JSONPath функционалност

Преглед

Овај одељак описује подржану JSONPath функционалност у оквиру корака претходне обраде вредности ставке.

JSONPath се састоји од сегмената раздвојених тачкама. Сегмент може бити у облику једноставне речи, која представља име JSON вредности, џокера (*) или сложеније конструкције затворене у угласте заграде. Тачка испред сегмента у заградама је опционална и може се изоставити.

JSONPath example Description
$.object.name Return object.name contents.
$.object['name'] Return object.name contents.
$.object.['name'] Return object.name contents.
$["object"]['name'] Return object.name contents.
$.['object'].["name"] Return object.name contents.
$.object.history.length() Return the number of object.history array elements.
$[?(@.name == 'Object')].price.first() Return the value of the price property from the first object named "Object".
$[?(@.name == 'Object')].history.first().length() Return the number of history array elements from the first object named "Object".
$[?(@.price > 10)].length() Return the number of objects with a price greater than 10.

Погледајте такође: Избегавање специјалних знакова из LLD макро вредности у JSONPath.

Подржани сегменти

Segment Description
<name> Подударање својства објекта по имену.
* Подударање свих својстава објекта.
['<name>'] Подударање својства објекта по имену.
['<name>', '<name>', ...] Подударање својства објекта по било ком од наведених имена.
[<index>] Подударање елемента низа по индексу.
[<number>, <number>, ...] Подударање елемента низа по било ком од наведених индекса.
[*] Подударање свих својстава објекта или елемената низа.
[<start>:<end>] Подударање елемената низа по дефинисаном опсегу:
<start> - први индекс који се подудара (укључујући); ако није наведено, подудара се са свим елементима низа од почетка; Ако је негативно, одређује почетни помак од краја низа;
<end> - последњи индекс који се подудара (искључујући); ако није наведено, подудара све елементе низа до краја; ако је негативно, одређује почетни помак од краја низа.
[?(<expression>)] Подударање објеката/елемената низа применом израза филтера.

Да бисте пронашли подударни сегмент игноришући његово порекло (одвојени сегмент), мора имати префикс од две тачке (..). На пример, $..name или $..['name'] враћају вредности свих својстава name.

Називи подударних елемената могу се издвојити додавањем суфикса тилде (~) на JSONPath. Враћа име подударног објекта или индекс у формату стринга подударног елемента низа. Излазни формат прати иста правила као и други JSONPath упити - резултати одређене путање се враћају 'as is', а резултати неодређене путање се враћају у низу. Међутим, постоји минимална вредност у издвајању имена елемента који одговара дефинитивној путањи, као што је већ познато.

Израз филтера

Израз филтера је аритметички израз у инфиксној нотацији.

Подржани операнди:

Operand Description
"<text>"
'<text>'
Text constant.

Example:
'value: \\'1\\''
"value: '1'"
<number> Numeric constant supporting scientific notation.

Example: 123
<jsonpath starting with $> Value referred to by the JSONPath from the input document root node; only definite paths are supported.

Example: $.object.name
<jsonpath starting with @> Value referred to by the JSONPath from the current object/element; only definite paths are supported.

Example: @.name

Подржани оператори:

Operator Type Description Result
- Binary Subtraction Number
+ Binary Addition Number
/ Binary Division Number
* Binary Multiplication Number
== Binary Equality Boolean (1/0)
!= Binary Inequality Boolean (1/0)
< Binary Less than Boolean (1/0)
<= Binary Less than or equal to Boolean (1/0)
> Binary Greater than Boolean (1/0)
>= Binary Greater than or equal to Boolean (1/0)
=~ Binary Matches regular expression Boolean (1/0)
! Unary Boolean NOT Boolean (1/0)
|| Binary Boolean OR Boolean (1/0)
&& Binary Boolean AND Boolean (1/0)

Функције

Функције се могу користити на крају JSONPath-а. Више функција може бити повезано ако претходна функција враћа вредност коју прихвата следећа функција.

Подржане функције: |Function|Description|Input|Output| |-|----|- -|---| |avg|Просечна вредност бројева у улазном низу|Низ бројева|Број| |min|Минимум вредност бројева у улазном низу|Низ бројева|Број| |max|Максимална вредност бројева у улазном низу|Низ бројева|Број| |sum|Збир бројева у улазном низу|Низ бројева |Број| |length|Број елемената у улазном низу|Низ|Број| |first|Први елемент низа|Низ| JSON конструкција (објекат, низ, вредност) у зависности од садржаја улазног низа|

JSONPath агрегатне функције прихватају наведене нумеричке вредности. Ове вредности се аутоматски конвертују из стрингова у нумеричке типове када је агрегација потребна. Некомпатибилно унос ће проузроковати да функција генерише грешку.

Излазна вредност

JSONPaths се могу поделити на одређене и неодређене путање. Дефинитивна путања може да врати само нулл или једно подударање. Неодређена путања може да врати вишеструка подударања: JSONPaths са одвојеним, вишеструким листама имена/индекса, исечцима низа или сегментима израза. Међутим, када ако се користи функција, JSONPath постаје дефинитиван, пошто функције увек излазе једну вредност.

Дефинитивна путања враћа објекат/низ/вредност на коју упућује. Насупрот томе, неодређена путања враћа низ одговарајућих објеката/низова/вредности.

Редослед својстава у резултатима упита JSONPath можда неће бити усклађен са оригиналним редоследом JSON својстава због интерне оптимизације методе. На пример, JSONPath $.books[1]["author", "title"] може да врати ["title", "author"].Ако је очување оригиналног поретка својстава неопходно, треба размотрити алтернативне методе обраде након упита.

Правила за форматирање путање

Размаци (размак, знак табулатора) се могу користити у сегментима и изразима за означавање заграда, на пример: $[ 'а' ][ 0 ][ ?( $.b == 'c') ][ : -1 ]. first ( ).

Стрингови треба да буду затворени једноструким (') или двоструким (") наводницима. Унутар стрингова, једноструки или двоструки наводники (у зависности од тога који се затворите га) и обрнуте косе црте (\) се избацују карактером обрнуте косе црте (\).

Примери

{
         "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
$.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"]

Note: This query shows that arithmetical operations can be used in queries; it can be simplified to $.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

Note: $..tags is an indefinite path, so it returns an array of matched elements, i.e., [["a", "b", "c", "d", "e" ]]; first() returns the first element, i.e., ["a", "b", "c", "d", "e"]; length() calculates the length of the element, i.e.,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 Note: A query without match returns NULL for definite and indefinite paths.
$.services[?(@.active=="true")].servicegroup indefinite [1001,1000]

Note: Text constants must be used in boolean value comparisons.
$.services[?(@.active=="false")].servicegroup indefinite [1002]

Note: Text constants must be used in boolean value comparisons.
$.services[?(@.servicegroup=="1002")]~.first() definite restoration