Овај одељак описује подржану 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 |