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 | |