Esta seção descreve a funcionalidade JSONPath suportada nas etapas de pré-processamento de valores de item.
JSONPath é composto por segmentos separados por pontos. Um segmento pode assumir a forma de uma palavra simples, representando um nome de valor JSON, o caractere curinga (*) ou uma construção mais complexa entre colchetes. O ponto antes de um segmento entre colchetes é opcional e pode ser omitido.
| Exemplo de JSONPath | 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 valor da propriedade price do primeiro objeto chamado "Object". |
$[?(@.name == 'Object')].history.first().length() |
Retorna o número de elementos do array history do primeiro objeto chamado "Object". |
$[?(@.price > 10)].length() |
Retorna o número de objetos com preço maior que 10. |
Veja também: Escapando caracteres especiais de valores de macros LLD em JSONPath.
| Segmento | Descrição |
|---|---|
<name> |
Corresponde à propriedade do objeto pelo nome. |
* |
Corresponde a todas as propriedades do objeto. |
['<name>'] |
Corresponde à propriedade do objeto pelo nome. |
['<name>', '<name>', ...] |
Corresponde à propriedade do objeto por qualquer um dos nomes listados. |
[<index>] |
Corresponde ao elemento do array pelo índice. |
[<number>, <number>, ...] |
Corresponde ao elemento do array por qualquer um dos índices listados. |
[*] |
Corresponde a todas as propriedades do objeto ou elementos do array. |
[<start>:<end>] |
Corresponde aos elementos do array pelo intervalo definido: <start> - o primeiro índice a ser correspondido (inclusive); se não especificado, corresponde a todos os elementos do array desde o início; se negativo, especifica o deslocamento inicial a partir do final do array; <end> - o último índice a ser correspondido (exclusivo); se não especificado, corresponde a todos os elementos do array até o final; se negativo, especifica o deslocamento inicial a partir do final do array. |
[?(<expression>)] |
Corresponde a objetos/elementos do array aplicando uma expressão de filtro. |
Para encontrar um segmento correspondente ignorando sua ancestralidade (segmento destacado), ele deve ser prefixado com dois pontos (..). Por exemplo, $..name ou $..['name'] retornam valores de todas as propriedades name.
Os nomes dos elementos correspondentes podem ser extraídos adicionando um sufixo til (~) ao JSONPath. Ele retorna o nome do objeto correspondente ou um índice em formato de string do item do array correspondente. O formato de saída segue as mesmas regras de outras consultas JSONPath - resultados de caminho definido são retornados 'como estão', e resultados de caminho indefinido são retornados em um array. No entanto, há valor mínimo em extrair o nome de um elemento que corresponde a um caminho definitivo, pois ele já é conhecido.
A expressão de filtro é uma expressão aritmética em notação infixa.
Operandos suportados:
| Operando | Descrição |
|---|---|
"<texto>"'<texto>' |
Constante de texto. Exemplo: 'value: \\'1\\''"value: '1'" |
<número> |
Constante numérica que suporta notação científica. Exemplo: 123 |
<jsonpath começando com $> |
Valor referenciado pelo JSONPath a partir do nó raiz do documento de entrada; apenas caminhos definidos são suportados. Exemplo: $.object.name |
<jsonpath começando com @> |
Valor referenciado pelo JSONPath a partir do objeto/elemento atual; apenas caminhos definidos são suportados. Exemplo: @.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 | Igualdade | Booleano (1/0) |
!= |
Binário | Desigualdade | Booleano (1/0) |
< |
Binário | Menor que | Booleano (1/0) |
<= |
Binário | Menor ou igual a | Booleano (1/0) |
> |
Binário | Maior que | Booleano (1/0) |
>= |
Binário | Maior ou igual a | Booleano (1/0) |
=~ |
Binário | Corresponde à expressão regular | Booleano (1/0) |
! |
Unário | NÃO booleano | Booleano (1/0) |
|| |
Binário | OU booleano | Booleano (1/0) |
&& |
Binário | E booleano | Booleano (1/0) |
Funções podem ser usadas no final do JSONPath. Múltiplas funções podem ser encadeadas se a função anterior retornar um valor que seja aceito pela função seguinte.
Funções suportadas:
| Função | Descrição | Entrada | Saída |
|---|---|---|---|
avg |
Valor médio dos números em um array de entrada | Array de números | Número |
min |
Valor mínimo dos números em um array de entrada | Array de números | Número |
max |
Valor máximo dos números em um array de entrada | Array de números | Número |
sum |
Soma dos números em um array de entrada | Array de números | Número |
length |
Número de elementos em um array de entrada | Array | Número |
first |
O primeiro elemento de um array | Array | Uma construção JSON (objeto, array, valor) dependendo do conteúdo do array de entrada |
Funções agregadas do JSONPath aceitam valores numéricos entre aspas. Esses valores são automaticamente convertidos de strings para tipos numéricos quando a agregação é necessária. Entradas incompatíveis farão com que a função gere um erro.
Os JSONPaths podem ser divididos em caminhos definidos e indefinidos. Um caminho definido pode retornar apenas nulo ou uma única correspondência. Um caminho indefinido pode retornar várias correspondências: JSONPaths com listas de nomes/índices destacadas, fatias de array ou segmentos de expressão. No entanto, quando uma função é usada, o JSONPath se torna definido, pois as funções sempre produzem um único valor.
Um caminho definido retorna o objeto/array/valor ao qual faz referência. Em contraste, um caminho indefinido retorna um array dos objetos/arrays/valores correspondentes.
A ordem das propriedades nos resultados da consulta JSONPath pode não corresponder à ordem original das propriedades do JSON devido a métodos internos de otimização. Por exemplo, o JSONPath $.books[1]["author", "title"] pode retornar ["title", "author"]. Se preservar a ordem original das propriedades for essencial, métodos alternativos de pós-processamento da consulta devem ser considerados.
Espaços em branco (espaço, caractere de tabulação) podem ser usados em segmentos de notação de colchetes e expressões, por exemplo: $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( ).
Strings devem ser delimitadas por aspas simples (') ou duplas ("). Dentro das strings, aspas simples ou duplas (dependendo de quais são usadas para delimitá-las) e barras invertidas (\) são escapadas com o caractere barra invertida (\).
{
"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 | Tipo | Resultado |
|---|---|---|
$.filters.price |
definido | 10 |
$.filters.category |
definido | fiction |
$.filters['no filters'] |
definido | no "filters" |
$.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 | ["Moby Dick", "Sayings of the Century"] |
$.books[1]['author', "title"] |
indefinido | ["Sword of Honour", "Evelyn Waugh"] |
$..id |
indefinido | [1, 2, 3, 4] |
$.services..price |
indefinido | [154.99, 5, 46, 24.5, 99.49] |
$.books[?(@.id == 4 - 0.4 * 5)].title |
indefinido | ["Sword of Honour"] Nota: Esta consulta mostra que operações aritméticas podem ser usadas em consultas; 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"] |
$.books[?(@.category == "fiction" && @.price < 10)].title |
indefinido | ["Moby Dick"] |
$..[?(@.id)] |
indefinido | [ { "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 |
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 Nota: $..tags é um caminho indefinido, então retorna um array de elementos correspondentes, ou seja, [["a", "b", "c", "d", "e" ]]; first() retorna o primeiro elemento, ou seja, ["a", "b", "c", "d", "e"]; length() calcula o comprimento do elemento, ou seja,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 | Nota: Uma consulta sem correspondência retorna NULL para caminhos definidos e indefinidos. |
$.services[?(@.active=="true")].servicegroup |
indefinido | [1001,1000] Nota: Constantes de texto devem ser usadas em comparações de valores booleanos. |
$.services[?(@.active=="false")].servicegroup |
indefinido | [1002] Nota: Constantes de texto devem ser usadas em comparações de valores booleanos. |
$.services[?(@.servicegroup=="1002")]~.first() |
definido | restoration |