3 Funcionalidad JSONPath

Descripción general

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.

Segmentos admitidos

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.

Filtrar expresión

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

Funciones

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.

Valor de salida

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.

Espacio en blanco

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().

Cadenas

Las cadenas deben estar entre comillas simples ' o dobles ". Dentro de las cadenas, las comillas simples o dobles (dependiendo de cuáles se utilicen para encerrar la cadena) y las barras invertidas \ se escapan con el carácter de barra invertida \.

Ejemplos

Datos de entrada
{
         "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