Esta sección proporciona detalles de la funcionalidad JSONPath admitida en los pasos de preprocesamiento del valor de la métrica.
JSONPath consta de segmentos separados por puntos. Un segmento puede ser o bien una palabra simple o el nombre de un valor JSON, *
o una construcción más compleja encerrada entre corchetes [
]
. El punto separador antes del segmento de soporte es opcional y se puede omitir. Por ejemplo:
Ruta | Descripción |
---|---|
$.object.name |
Devuelve el contenido del object.name. |
$.object['name'] |
Devuelve el contenido de object.name. |
$.object.['name'] |
Devuelve el contenido de object.name. |
$["object"]['name'] |
Devuelve el contenido de object.name. |
$.['object'].["name"] |
Devuelve el contenido del object.name. |
$.object.history.length() |
Devuelve el número de elementos de la matriz object.history. |
$[?(@.name == 'Object')].price.first() |
Devuelve el campo de precio del primer objeto con nombre 'Object'. |
$[?(@.name == 'Object')].history.first().length() |
Devuelve el número de elementos de la matriz histórica del primer objeto con nombre 'Object'. |
$[?(@.price > 10)].length() |
Devuelve el número de objetos con un precio mayor que 10. |
Ver también: Escapar con caracteres especiales los valores de macro LLD en JSONPath.
Segmento | Descripción |
---|---|
<nombre> |
Hacer coincidir la propiedad del objeto por nombre. |
* |
Coincide con todas las propiedades del objeto. |
['<nombre>'] |
Hacer coincidir la propiedad del objeto por nombre. |
['<nombre>', '<nombre>', ...] |
Haga coincidir la propiedad del objeto con cualquiera de los nombres enumerados. |
[<índice>] |
Haga coincidir el elemento de la matriz por el índice. |
[<número>, <número>, ...] |
Haga coincidir el elemento de la matriz con cualquiera de los índices enumerados. |
[*] |
Coincide con todas las propiedades del objeto o elementos de la matriz. |
[<start>:<end>] |
Haga coincidir los elementos de la matriz según el rango definido: <start> - el primer índice que coincida (incluido). Si no se especifica, coincide con todos los elementos de la matriz desde el principio. Si es negativo, especifica el desplazamiento inicial desde el final de la matriz. <end>: el último índice que coincide (excluyendo). Si no se especifica, coincide con todos los elementos de la matriz hasta el final. Si es negativo, especifica el desplazamiento inicial desde el final de la matriz. |
[?(<expresión>)] |
Haga coincidir objetos/elementos de matriz aplicando una expresión de filtro. |
Para encontrar un segmento coincidente ignorando su ascendencia (segmento separado) debe tener el prefijo '..', por ejemplo, $..nombre
o $..['nombre']
retorna los valores de todas las propiedades de 'nombre'.
Los nombres de elementos coincidentes se pueden extraer agregando un sufijo ~
al JSONPath. Devuelve el nombre del objeto coincidente o un índice en formato de cadena del elemento de matriz coincidente. El formato de salida sigue las mismas reglas que otras consultas JSONPath: los resultados de la ruta definitiva son devueltos 'tal cual' y los resultados de ruta indefinida se devuelven en una matriz. Sin embargo, no tiene mucho sentido extraer el nombre de un elemento que coincide con un camino definido: ya se conoce.
La expresión de filtro es una expresión aritmética en notación infija.
Operandos soportados:
Operando | Descripción | Ejemplo |
---|---|---|
"<text>" '<text>' |
Constante de texto. | 'valor: \'1\'' "valor: '1'" |
<número> |
Constante numérica que respalda la notación científica. | 123 |
<jsonpath comenzando con $> |
Valor al que hace referencia JSONPath desde el nodo raíz del documento de entrada; sólo se admiten rutas definidas. | $.object.name |
<jsonpath comenzando con @> |
Valor al que hace referencia JSONPath desde el objeto/elemento actual; sólo se admiten rutas definidas. | @.name |
Operadores soportados:
Operador | Tipo | Descripción | Resultado |
---|---|---|---|
- |
binario | Resta. | Número. |
+ |
binario | Suma. | Número. |
/ |
binario | División. | Número. |
* |
binario | Multiplicación. | Número. |
== |
binario | Es igual a. | Booleano (1 o 0). |
!= |
binario | No es igual a. | Booleano (1 o 0). |
< |
binario | Es menor que. | Booleano (1 o 0). |
<= |
binario | Es menor o igual que. | Booleano (1 o 0). |
> |
binario | Es mayor que. | Booleano (1 o 0). |
>= |
binario | Es mayor o igual que. | Booleano (1 o 0). |
=~ |
binario | Coincide con la expresión regular. | Booleano (1 o 0). |
! |
unario | No booleano. | Booleano (1 o 0). |
|| |
binario | O booleano. | Booleano (1 o 0). |
&& |
binario | Y booleano. | Booleano (1 o 0). |
Las funciones se pueden utilizar al final de JSONPath. Múltiples funciones pueden ser encadenadas si la función anterior devuelve un valor aceptado por la siguiente función.
Funciones soportadas:
Función | Descripción | Entrada | Salida |
---|---|---|---|
avg |
Valor promedio de números en la matriz de entrada. | Matriz de números. | Número. |
min |
Valor mínimo de números en la matriz de entrada. | Matriz de números. | Número. |
max |
Valor máximo de números en la matriz de entrada. | Matriz de números. | Número. |
sum |
Suma de números en la matriz de entrada. | Matriz de números. | Número. |
length |
Número de elementos en la matriz de entrada. | Matriz. | Número. |
first |
El primer elemento de la matriz. | Matriz. | Una construcción JSON (objeto, matriz, valor) que depende del contenido de la matriz de entrada. |
Los valores numéricos citados son aceptados por las funciones agregadas JSONPath. Significa que los valores se convierten de tipo cadena a numérico si se requiere agregación.
Una entrada incompatible hará que la función genere un error.
JSONPaths se puede dividir en rutas definidas e indefinidas. Una ruta definida puede devolver solo un valor nulo o una única coincidencia. Una ruta indefinida puede devolver múltiples coincidencias, básicamente segmentos JSONPaths con múltiples y separadas listas de nombres/índices, segmentos de matriz o segmentos de expresión. Sin embargo, cuando se utiliza la función, JSONPath se vuelve definido, como siempre lo hacen las funciones de salida de valor único.
Una ruta definida devuelve el objeto/matriz/valor al que hace referencia, mientras que una ruta indefinida devuelve una matriz de objetos/matrices/valores coincidentes.
Es posible que el orden de las propiedades en los resultados de la consulta JSONPath no se alinee con el orden de las propiedades JSON originales debido a los métodos de optimización internos. Por ejemplo, JSONPath $.books[1]["autor", "título"]
puede devolver ["título", "autor"]
. Si es esencial preservar el orden de la propiedad original, se deben considerar métodos alternativos de procesamiento posterior a la consulta.
Los espacios en blanco (espacios, caracteres de tabulación) se pueden utilizar libremente notación y expresiones de segmentos entre paréntesis, por ejemplo, $[ 'a' ][ 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 | Tipo | Resultado | Comentarios |
---|---|---|---|
$.filters.price |
definida | 10 | |
$.filters.category |
definida | fiction | |
$.filters['no filters'] |
definida | no "filters" | |
$.filters |
definida | { "price": 10, "category": "fiction", "no filters": "no \"filters\"" } |
|
$.books[1].title |
definida | Sword of Honour | |
$.books[-1].author |
definida | J. R. R. Tolkien | |
$.books.length() |
definida | 4 | |
$.tags[:] |
indefinida | ["a", "b", "c", "d", "e" ] | |
$.tags[2:] |
indefinida | ["c", "d", "e" ] | |
$.tags[:3] |
indefinida | ["a", "b", "c"] | |
$.tags[1:4] |
indefinida | ["b", "c", "d"] | |
$.tags[-2:] |
indefinida | ["d", "e"] | |
$.tags[:-3] |
indefinida | ["a", "b"] | |
$.tags[:-3].length() |
definida | 2 | |
$.books[0, 2].title |
indefinida | ["Moby Dick", "Sayings of the Century"] | |
$.books[1]['author', "title"] |
indefinida | ["Sword of Honour", "Evelyn Waugh"] | |
$..id |
indefinida | [1, 2, 3, 4] | |
$.services..price |
indefinida | [154.99, 5, 46, 24.5, 99.49] | |
$.books[?(@.id == 4 - 0.4 * 5)].title |
indefinida | ["Sword of Honour"] | Esta consulta muestra que las operaciones aritméticas pueden ser usadas en las consultas. Por supuesto, esta consulta puede ser simplificada a $.books[?(@.id == 2)].title |
$.books[?(@.id == 2 \|\| @.id == 4)].title |
indefinida | ["Sword of Honour", "The Lord of the Rings"] | |
$.books[?(!(@.id == 2))].title |
indefinida | ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"] | |
$.books[?(@.id != 2)].title |
indefinida | ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"] | |
$.books[?(@.title =~ " of ")].title |
indefinida | ["Sayings of the Century", "Sword of Honour", "The Lord of the Rings"] | |
$.books[?(@.price > 12.99)].title |
indefinida | ["The Lord of the Rings"] | |
$.books[?(@.author > "Herman Melville")].title |
indefinida | ["Sayings of the Century", "The Lord of the Rings"] | |
$.books[?(@.price > $.filters.price)].title |
indefinida | ["Sword of Honour", "The Lord of the Rings"] | |
$.books[?(@.category == $.filters.category)].title |
indefinida | ["Sword of Honour","Moby Dick","The Lord of the Rings"] | |
$.books[?(@.category == "fiction" && @.price < 10)].title |
indefinida | ["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 |
indefinida | '["Printing and assembling book in A5 format", "Rebinding torn book"] | |
$..id.length() |
definite | 4 | |
$.books[?(@.id == 2)].title.first() |
definida | Sword of Honour | |
$..tags.first().length() |
definida | 5 | $..tags es una ruta indefinida, por lo que devuelve una matriz de los elementos coincidentes - [["a", "b", "c", "d", "e" ]], first() devuelve el primer elemento - ["a", "b", "c", "d", "e" ] y finalmente length() calcula su longitud - 5. |
$.books[*].price.min() |
definida | 8.95 | |
$..price.max() |
definida | 154.99 | |
$.books[?(@.category == "fiction")].price.avg() |
definida | 14.99 | |
$.books[?(@.category == $.filters.xyz)].title |
indefinida | Una consulta sin coincidencias devuelve un valor NULL tanto para rutas definidas como indefinidas. | |
$.services[?(@.active=="true")].servicegroup |
indefinida | [1001,1000] | Constantes de texto deben ser usadas en las comparaciones con valores booleanos. |
$.services[?(@.active=="false")].servicegroup |
indefinida | [1002] | Constantes de texto deben ser usadas en las comparaciones con valores booleanos. |
$.services[?(@.servicegroup=="1002")]~.first() |
definida | restoration |