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

Преглед

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

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

JSONPath example Description
$.object.name Врати object.name садржај.
$.object['name'] Врати object.name садржај.
$.object.['name'] Врати object.name садржај.
$["object"]['name'] Врати object.name садржај.
$.['object'].["name"] Врати object.name садржај.
$.object.history.length() Врати број елемената низа object.history.
$[?(@.name == 'Object')].price.first() Врати вредност својства price из првог објекта под називом "Object".
$[?(@.name == 'Object')].history.first().length() Врати број елемената низа историје из првог објекта под називом "Object".
$[?(@.price > 10)].length() Врати број објеката са ценом већом од 10.

Такође погледати: Избегавање специјалних знакова из вредности Избегавање специјалних знакова из вредности ЛЛД макроа у ЈСОНПатх-у макроа у JSONPath-у.

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

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

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

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

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

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

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

Operand Description
"<text>"
'<text>'
Текстуална константа.<бр><бр>Пример:
'вредност: \\'1\\''<бр>"вредност: '1'"
<number> Нумеричка константа која подржава научну нотацију.<бр><бр>Пример: 123
<jsonpath starting with $> Вредност на коју упућује JSONPath из улаза корен документа; подржане су само одређене путање.

Пример: $.object.name
<jsonpath starting with @> Вредност на коју упућује JSONPath из тренутног објекта/елемента; подржане су само одређене путање.

Пример: @.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"]

Напомена: Овај упит показује да се аритметичке операције могу користити у упитима; може се поједноставити у $.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|Напомена: Упит без подударања враћа NULL за одређене и неодређене путање.| |$.services[?(@.active=="true")].servicegroup|indefinite|[1001,1000]

Напомена: Текстуалне константе се морају користити у поређењима логичких вредности.| |$.services[?(@.active=="false")].servicegroup|indefinite|[1002]

Напомена: Текстуалне константе се морају користити у поређењима логичких вредности.| |$.services[?(@.servicegroup=="1002")]~.first()|definite|restoration|