Esta seção fornece detalhes da funcionalidade JSONPath suportado em etapas de pré-processamento de valores de item.
O JSONPath consiste de segmentos separados com pontos. Um segmento pode ser ou uma simples palavra como nome de valor JSON, *
ou um caso mais complexo envolto em colchetes [
]
. O ponto de separação antes do segmento em colchete é opcional e pode ser omitido. Por exemplo:
Path (caminho) | Descrição |
---|---|
$.object.name |
Retorna o conteúdo de object.name. |
$.object['name'] |
Retorna o conteúdo de object.name. |
$.object.['name'] |
Retorna o conteúdo de object.name. |
$["object"]['name'] |
Retorna o conteúdo de object.name. |
$.['object'].["name"] |
Retorna o conteúdo de object.name. |
$.object.history.length() |
Retorna o número de elementos do array object.history. |
$[?(@.name == 'Object')].price.first() |
Retorna o campo preço (price) do primeiro objeto com nome 'Object'. |
$[?(@.name == 'Object')].history.first().length() |
Retorna o número de elementos do array 'history' do primeiro objeto com nome 'Object'. |
$[?(@.price > 10)].length() |
Retorna o número de objetos com preço (price) sendo maior que 10. |
Veja também: Escapando caracteres especiais de valores de macro LLD no JSONPath.
Segmento | Descrição |
---|---|
<name> |
Corresponde propriedade do objeto por nome. |
* |
Corresponde todas as propriedades do objeto. |
['<name>'] |
Corresponde propriedade de objeto por nome. |
['<name>', '<name>', ...] |
Corresponde propriedade do objeto por qualquer dos nomes listados. |
[<index>] |
Corresponde elemento do array pelo índice. |
[<number>, <number>, ...] |
Corresponde elemento do array por qualquer índice listado. |
[*] |
Corresponde todas as propriedades do objeto ou elementos do array. |
[<start>:<end>] |
Corresponde elementos do array pelo intervalo definido: <start> - o primeiro índice para corresponder (inclusive). Se não especificado faz a correspondência de todos os elementos do array desde o início. Se negativo especifica o início de deslocamento a partir do fim do array. <end> - o último índice para corresponder (exclusive). Se não especificado faz a correspondência de todos os elementos do array até o fim. Se negativo especifica o início de deslocamento a partir do fim do array. |
[?(<expression>)] |
Corresponde elementos de objetos/array pela aplicação de expressão de filtro. |
Para encontrar um segmento correspondente ignorando sua ancestralidade (segmento destacado) deve ser prefixado com '..', por exemplo $..name
ou $..['name']
retorna valores de todas as propriedades 'name'.
Nomes de elemento correspondidos podem ser extraídos pela adição de um sufixo ~
ao JSONPath. Ele retorna o nome do objeto correspondido ou um índice no formato string do item de array correspondente. O formato de saída segue as mesmas regras das outras consultas JSONPath - resultados de caminho definido são retornados 'como são' e resultados de caminho não definido são retornados em array. No entanto não há muita lógica em extrair o nome de um elemento correspondente a um caminho definido - ele já é conhecido.
A expressão de filtro é uma expressão aritmética em notação infix.
Operandos suportados:
Operando | Descrição | Exemplo |
---|---|---|
"<text>" '<text>' |
Constante de texto. | 'value: \'1\'' "value: '1'" |
<number> |
Constant numérica suportando notação científica. | 123 |
<jsonpath starting with $> |
Valor referenciado pelo JSONPath do nó raíz do documento de entrada; apenas caminhos (paths) definidos são suportados. | $.object.name |
<jsonpath starting with @> |
Valor referenciado pelo JSONPath do objeto/elemento atual; apenas caminhos (paths) definidos são suportados. | @.name |
Operadores suportados:
Operador | Tipo | Descrição | Resultado |
---|---|---|---|
- |
binário | Subtração. | Número. |
+ |
binário | Adição. | Número. |
/ |
binário | Divisão. | Número. |
* |
binário | Multiplicação. | Número. |
== |
binário | É igual a. | Booleano. (1 or 0). |
!= |
binário | Não é igual a. | Booleano. (1 or 0). |
< |
binário | É menor que. | Booleano. (1 or 0). |
<= |
binário | É menor ou igual a. | Booleano. (1 or 0). |
> |
binário | É maior que. | Booleano. (1 or 0). |
>= |
binário | É maior ou igual a. | Booleano. (1 or 0). |
=~ |
binário | Corresponde expressão regular. | Booleano. (1 or 0). |
! |
unário | Booleano. não (not). | Booleano. (1 or 0). |
\|\| |
binário | Booleano. ou (or). | Booleano. (1 or 0). |
&& |
binário | Booleano. e (and). | Booleano. (1 or 0). |
Funções podem ser usadas no fim do JSONPath. Múltiplas funções podem ser amarradas se a função precedente retorna valor que é aceito pela função seguinte.
Funções suportadas:
Função | Descrição | Entrada | Saída |
---|---|---|---|
avg |
Valor médio de números no array de entrada. | Array de números. | Número. |
min |
Valor mínimo de números no array de entrada. | Array de números. | Número. |
max |
Valor máximo de números no array de entrada. | Array de números. | Número. |
sum |
Soma de números no array de entrada. | Array de números. | Número. |
length |
Número de elementos no array de entrada. | Array. | Número. |
first |
O primeiro elemento do array. | Array. | Uma construct JSON (objeto, array, valor) dependendo do conteúdo do array de entrada. |
Valores numéricos quotados são aceitos pelas funções agregadas JSONPath. Isto significa que os valores são convertidos do tipo string para numérico se agregação é necessária.
Uma entrada incompatível causará geração de erro pela função.
Os JSONPaths podem ser divididos em caminhos definidos e indefinidos. Um caminho definido pode retornar apenas null ou uma simples correspondência. Um caminho indefinido pode retornar múltiplas correspondências, basicamente JSONPaths com múltiplas listas de nome/índice, parte de array ou segmentos de expressão destacados. No entanto, quando uma função é usada o JSONPath se torna definido, pois as funções sempre entregam valores únicos.
Um caminho definido retorna o objeto/array/valor que ele está referenciando, enquanto um caminho indefinido retorna um array dos objetos/arrays/valores correspondidos.
O espaço em branco (espaço, caracteres de tabulação) pode ser usado livremente em segmentos e expressões com notação em colchetes, por exemplo, $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( )
.
As strings devem ser quotadas (envoltas) com aspas simples ' ou duplas ". Dentro das strings, as aspas simples ou duplas (dependendo de quais são usadas para quotá-la) e contrabarras \
são escapadas com o caracter contrabarra \
.
{
"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": "Checmical 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 | Tipo | Resultado | Comentários |
---|---|---|---|
$.filters.price |
definido | 10 | |
$.filters.category |
definido | fiction | |
$.filters['no filters'] |
definido | no "filters" (sem filtros) | |
$.filters |
definido | { "price": 10, "category": "fiction", "no filters": "no \"filters\"" } |
|
$.books[1].title |
definido | Sword of Honour | |
$.books[-1].author |
definido | J. R. R. Tolkien | |
$.books.length() |
definido | 4 | |
$.tags[:] |
indefinido | ["a", "b", "c", "d", "e" ] | |
$.tags[2:] |
indefinido | ["c", "d", "e" ] | |
$.tags[:3] |
indefinido | ["a", "b", "c"] | |
$.tags[1:4] |
indefinido | ["b", "c", "d"] | |
$.tags[-2:] |
indefinido | ["d", "e"] | |
$.tags[:-3] |
indefinido | ["a", "b"] | |
$.tags[:-3].length() |
definido | 2 | |
$.books[0, 2].title |
indefinido | ["Sayings of the Century", "Moby Dick"] | |
$.books[1]['author', "title"] |
indefinido | ["Evelyn Waugh", "Sword of Honour"] | |
$..id |
indefinido | [1, 2, 3, 4] | |
$.services..price |
indefinido | [5, 154.99, 46, 24.5, 99.49] | |
$.books[?(@.id == 4 - 0.4 * 5)].title |
indefinido | ["Sword of Honour"] | Esta consulta mostra que operações aritméticas podem ser usadas em consultas. É claro que esta consulta pode ser simplificada para $.books[?(@.id == 2)].title |
$.books[?(@.id == 2 \|\| @.id == 4)].title |
indefinido | ["Sword of Honour", "The Lord of the Rings"] | |
$.books[?(!(@.id == 2))].title |
indefinido | ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"] | |
$.books[?(@.id != 2)].title |
indefinido | ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"] | |
$.books[?(@.title =~ " of ")].title |
indefinido | ["Sayings of the Century", "Sword of Honour", "The Lord of the Rings"] | |
$.books[?(@.price > 12.99)].title |
indefinido | ["The Lord of the Rings"] | |
$.books[?(@.author > "Herman Melville")].title |
indefinido | ["Sayings of the Century", "The Lord of the Rings"] | |
$.books[?(@.price > $.filters.price)].title |
indefinido | ["Sword of Honour", "The Lord of the Rings"] | |
$.books[?(@.category == $.filters.category)].title |
indefinido | ["Sword of Honour","Moby Dick","The Lord of the Rings"] | |
$..[?(@.id)] |
indefinido | [ { "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..[?(@.price > 50)].description |
indefinido | '["Printing and assembling book in A5 format", "Rebinding torn book"] | |
$..id.length() |
definido | 4 | |
$.books[?(@.id == 2)].title.first() |
definido | Sword of Honour | |
$..tags.first().length() |
definido | 5 | $..tags é um caminho indefinido, então ele retorna um array de elementos correspondidos - [["a", "b", "c", "d", "e" ]], first() retorna o primeiro elemento - ["a", "b", "c", "d", "e" ] e finalmente length() calcula seu comprimento - 5. |
$.books[*].price.min() |
definido | 8.95 | |
$..price.max() |
definido | 154.99 | |
$.books[?(@.category == "fiction")].price.avg() |
definido | 14.99 | |
$.books[?(@.category == $.filters.xyz)].title |
indefinido | Uma consulta sem correspondência retorna NULL para caminhos definido e indefinido. | |
$.services[?(@.active=="true")].servicegroup |
indefinido | [1000,1001] | Constantes de texto devem ser usadas em comparações de valor booleano. |
$.services[?(@.active=="false")].servicegroup |
indefinido | [1002] | Constantes de texto devem ser usadas em comparações de valor booleano. |
$.services[?(@.servicegroup=="1002")]~.first() |
definido | restoration |