Se encuentra viendo la documentación de la versión en desarrollo, puede estar incompleta.
Esta página fue traducida automáticamente. Si detectas un error, selecciónalo y presiona Ctrl+Enter para informarlo a los editores.

4 Funcionalidad JSONPath

Descripción general

Esta sección describe la funcionalidad JSONPath compatible dentro de los pasos de preprocesamiento de valores de métricas.

JSONPath se compone de segmentos separados por puntos. Un segmento puede tomar la forma de una palabra simple, que representa un nombre de valor JSON, el carácter comodín (*), o una construcción más compleja encerrada entre corchetes. El punto antes de un segmento entre corchetes es opcional y puede omitirse.

Ejemplo de JSONPath Descripción
$.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 de object.name.
$.['object'].["name"] Devuelve el contenido de object.name.
$.object.history.length() Devuelve el número de elementos del array object.history.
$[?(@.name == 'Object')].price.first() Devuelve el valor de la propiedad price del primer objeto llamado "Object".
$[?(@.name == 'Object')].history.first().length() Devuelve el número de elementos del array history del primer objeto llamado "Object".
$[?(@.price > 10)].length() Devuelve el número de objetos con un precio mayor que 10.

Véase también: Escapando caracteres especiales de valores de macros LLD en JSONPath.

Segmentos soportados

Segmento Descripción
<name> Coincide con la propiedad del objeto por nombre.
* Coincide con todas las propiedades del objeto.
['<name>'] Coincide con la propiedad del objeto por nombre.
['<name>', '<name>', ...] Coincide con la propiedad del objeto por cualquiera de los nombres listados.
[<index>] Coincide con el elemento del array por índice.
[<number>, <number>, ...] Coincide con el elemento del array por cualquiera de los índices listados.
[*] Coincide con todas las propiedades del objeto o elementos del array.
[<start>:<end>] Coincide con los elementos del array por el rango definido:
<start> - el primer índice a coincidir (incluido); si no se especifica, coincide con todos los elementos del array desde el principio; si es negativo, especifica el desplazamiento inicial desde el final del array;
<end> - el último índice a coincidir (excluido); si no se especifica, coincide con todos los elementos del array hasta el final; si es negativo, especifica el desplazamiento inicial desde el final del array.
[?(<expression>)] Coincide con objetos/elementos del array aplicando una expresión de filtro.

Para encontrar un segmento coincidente ignorando su ascendencia (segmento separado), debe ir precedido de dos puntos (..). Por ejemplo, $..name o $..['name'] devuelven los valores de todas las propiedades name.

Los nombres de los elementos coincidentes pueden extraerse añadiendo un sufijo de tilde (~) a la JSONPath. Devuelve el nombre del objeto coincidente o un índice en formato de cadena del elemento del array coincidente. El formato de salida sigue las mismas reglas que otras consultas JSONPath: los resultados de rutas definidas se devuelven 'tal cual', y los resultados de rutas indefinidas se devuelven en un array. Sin embargo, tiene un valor mínimo extraer el nombre de un elemento que coincide con una ruta definitiva, ya que ya se conoce.

Expresión de filtro

La expresión de filtro es una expresión aritmética en notación infija.

Operandos soportados:

Operando Descripción
"<texto>"
'<texto>'
Constante de texto.

Ejemplo:
'valor: \\'1\\''
"valor: '1'"
<número> Constante numérica que soporta notación científica.

Ejemplo: 123
<jsonpath comenzando con $> Valor referido por el JSONPath desde el nodo raíz del documento de entrada; solo se admiten rutas definidas.

Ejemplo: $.objeto.nombre
<jsonpath comenzando con @> Valor referido por el JSONPath desde el objeto/elemento actual; solo se admiten rutas definidas.

Ejemplo: @.nombre

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 Igualdad Booleano (1/0)
!= Binario Desigualdad Booleano (1/0)
< Binario Menor que Booleano (1/0)
<= Binario Menor o igual que Booleano (1/0)
> Binario Mayor que Booleano (1/0)
>= Binario Mayor o igual que Booleano (1/0)
=~ Binario Coincide con expresión regular Booleano (1/0)
! Unario NO booleano Booleano (1/0)
|| Binario O booleano Booleano (1/0)
&& Binario Y booleano Booleano (1/0)

Funciones

Las funciones pueden usarse al final de JSONPath. Se pueden encadenar múltiples funciones si la función anterior devuelve un valor que es aceptado por la siguiente función.

Funciones soportadas:

Función Descripción Entrada Salida
avg Valor promedio de los números en una matriz de entrada Matriz de números Número
min Valor mínimo de los números en una matriz de entrada Matriz de números Número
max Valor máximo de los números en una matriz de entrada Matriz de números Número
sum Suma de los números en una matriz de entrada Matriz de números Número
length Número de elementos en una matriz de entrada Matriz Número
first El primer elemento de una matriz Matriz Una construcción JSON (objeto, matriz, valor) dependiendo del contenido de la matriz de entrada

Las funciones de agregación de JSONPath aceptan valores numéricos entre comillas. Estos valores se convierten automáticamente de cadenas a tipos numéricos cuando se necesita la agregación. Una entrada incompatible hará que la función genere un error.

Valor de salida

Los JSONPaths pueden dividirse en rutas definidas e indefinidas. Una ruta definida solo puede devolver null o una coincidencia única. Una ruta indefinida puede devolver múltiples coincidencias: JSONPaths con listas de nombres/índices separadas, cortes de arrays o segmentos de expresión. Sin embargo, cuando se utiliza una función, el JSONPath se convierte en definido, ya que las funciones siempre devuelven un único valor.

Una ruta definida devuelve el objeto/array/valor al que hace referencia. En cambio, una ruta indefinida devuelve un array de los objetos/arrays/valores coincidentes.

El orden de las propiedades en los resultados de la consulta JSONPath puede no coincidir con el orden original de las propiedades JSON debido a métodos internos de optimización. Por ejemplo, el JSONPath $.books[1]["author", "title"] puede devolver ["title", "author"]. Si es esencial preservar el orden original de las propiedades, se deben considerar métodos alternativos de procesamiento posterior a la consulta.

Reglas de formato de ruta

Los espacios en blanco (espacio, carácter de tabulación) pueden usarse en los segmentos de notación de corchetes y expresiones, por ejemplo: $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( ).

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

Ejemplo

{
         "books": [
           {
             "category": "referencia",
             "author": "Nigel Rees",
             "title": "Dichos del Siglo",
             "price": 8.95,
             "id": 1
           },
           {
             "category": "ficción",
             "author": "Evelyn Waugh",
             "title": "Espada de Honor",
             "price": 12.99,
             "id": 2
           },
           {
             "category": "ficción",
             "author": "Herman Melville",
             "title": "Moby Dick",
             "isbn": "0-553-21311-3",
             "price": 8.99,
             "id": 3
           },
           {
             "category": "ficción",
             "author": "J. R. R. Tolkien",
             "title": "El Señor de los Anillos",
             "isbn": "0-395-19395-8",
             "price": 22.99,
             "id": 4
           }
         ],
         "services": {
           "delivery": {
             "servicegroup": 1000,
             "description": "Entrega al día siguiente en la ciudad local",
             "active": true,
             "price": 5
           },
           "bookbinding": {
             "servicegroup": 1001,
             "description": "Impresión y encuadernación del libro en formato A5",
             "active": true,
             "price": 154.99
           },
           "restoration": {
             "servicegroup": 1002,
             "description": "Varios métodos de restauración",
             "active": false,
             "methods": [
               {
                 "description": "Limpieza química",
                 "price": 46
               },
               {
                 "description": "Prensado de páginas dañadas por humedad",
                 "price": 24.5
               },
               {
                 "description": "Reencuadernación de libro rasgado",
                 "price": 99.49
               }
             ]
           }
         },
         "filters": {
           "price": 10,
           "category": "ficción",
           "no filters": "sin \"filtros\""
         },
         "closed message": "La tienda está cerrada",
         "tags": [
           "a",
           "b",
           "c",
           "d",
           "e"
         ]
       }
JSONPath Type Result
$.filters.price definite 10
$.filters.category definite ficción
$.filters['no filters'] definite sin "filtros"
$.filters definite {
"price": 10,
"category": "ficción",
"no filters": "sin \"filtros\""
}
$.books[1].title definite Espada de Honor
$.books[-1].author definite J. R. R. Tolkien
$.books.length() definite 4
$.tags[:] indefinite ["a", "b", "c", "d", "e" ]
$.tags[2:] indefinite ["c", "d", "e" ]
$.tags[:3] indefinite ["a", "b", "c"]
$.tags[1:4] indefinite ["b", "c", "d"]
$.tags[-2:] indefinite ["d", "e"]
$.tags[:-3] indefinite ["a", "b"]
$.tags[:-3].length() definite 2
$.books[0, 2].title indefinite ["Moby Dick", "Dichos del Siglo"]
$.books[1]['author', "title"] indefinite ["Espada de Honor", "Evelyn Waugh"]
$..id indefinite [1, 2, 3, 4]
$.services..price indefinite [154.99, 5, 46, 24.5, 99.49]
$.books[?(@.id == 4 - 0.4 * 5)].title indefinite ["Espada de Honor"]

Nota: Esta consulta muestra que se pueden usar operaciones aritméticas en las consultas; se puede simplificar a $.books[?(@.id == 2)].title
$.books[?(@.id == 2 \|\| @.id == 4)].title indefinite ["Espada de Honor", "El Señor de los Anillos"]
$.books[?(!(@.id == 2))].title indefinite ["Dichos del Siglo", "Moby Dick", "El Señor de los Anillos"]
$.books[?(@.id != 2)].title indefinite ["Dichos del Siglo", "Moby Dick", "El Señor de los Anillos"]
$.books[?(@.title =~ " of ")].title indefinite ["Dichos del Siglo", "Espada de Honor", "El Señor de los Anillos"]
$.books[?(@.price > 12.99)].title indefinite ["El Señor de los Anillos"]
$.books[?(@.author > "Herman Melville")].title indefinite ["Dichos del Siglo", "El Señor de los Anillos"]
$.books[?(@.price > $.filters.price)].title indefinite ["Espada de Honor", "El Señor de los Anillos"]
$.books[?(@.category == $.filters.category)].title indefinite ["Espada de Honor","Moby Dick","El Señor de los Anillos"]
$.books[?(@.category == "fiction" && @.price < 10)].title indefinite ["Moby Dick"]
$..[?(@.id)] indefinite [
{
"price": 8.95,
"id": 1,
"category": "referencia",
"author": "Nigel Rees",
"title": "Dichos del Siglo"
},
{
"price": 12.99,
"id": 2,
"category": "ficción",
"author": "Evelyn Waugh",
"title": "Espada de Honor"
},
{
"price": 8.99,
"id": 3,
"category": "ficción",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3"
},
{
"price": 22.99,
"id": 4,
"category": "ficción",
"author": "J. R. R. Tolkien",
"title": "El Señor de los Anillos",
"isbn": "0-395-19395-8"
}
]
$.services..[?(@.price > 50)].description indefinite ["Impresión y encuadernación del libro en formato A5", "Reencuadernación de libro rasgado"]
$..id.length() definite 4
$.books[?(@.id == 2)].title.first() definite Espada de Honor
$..tags.first().length() definite 5

Nota: $..tags es una ruta indefinida, por lo que devuelve un array de elementos coincidentes, es decir, [["a", "b", "c", "d", "e" ]]; first() devuelve el primer elemento, es decir, ["a", "b", "c", "d", "e"]; length() calcula la longitud del elemento, es decir,5.
$.books[*].price.min() definite 8.95
$..price.max() definite 154.99
$.books[?(@.category == "fiction")].price.avg() definite 14.99
$.books[?(@.category == $.filters.xyz)].title indefinite Nota: Una consulta sin coincidencia devuelve NULL para rutas definidas e indefinidas.
$.services[?(@.active=="true")].servicegroup indefinite [1001,1000]

Nota: Las constantes de texto deben usarse en comparaciones de valores booleanos.
$.services[?(@.active=="false")].servicegroup indefinite [1002]

Nota: Las constantes de texto deben usarse en comparaciones de valores booleanos.
$.services[?(@.servicegroup=="1002")]~.first() definite restoration