JSON Extractor - JSONPath
Table of Contents
Intermedio - This article is part of a series.
¿ Qué es JSONPath ? #
La especificación de JSONPath fue creada en 2007 por Stefan Goessner como una alternativa al lenguaje XPath utilizado para acceder a datos en documentos XML. Goessner creó JSONPath como una forma de acceder y manipular datos en documentos JSON utilizando una sintaxis similar a XPath. En los años siguientes, JSONPath se hizo cada vez más popular entre los desarrolladores que trabajan con aplicaciones web y móviles que utilizan JSON como formato de intercambio de datos. La especificación de JSONPath fue adoptada por varias bibliotecas y herramientas populares de JavaScript, como jQuery y JSONPath+.
En 2012, la especificación de JSONPath fue adoptada como un estándar de Internet por la Open Web Foundation, lo que ayudó a impulsar su adopción y aceptación en la comunidad de desarrolladores. Hoy en día, JSONPath sigue siendo una herramienta popular para acceder y manipular datos en documentos JSON en aplicaciones web y móviles. Es compatible con una amplia variedad de lenguajes de programación, y se utiliza en una variedad de contextos, como el análisis de datos, la integración de sistemas y la automatización de procesos.
¿ Qué es JSON ? #
JSON (JavaScript Object Notation) es un formato de texto ligero y fácil de leer para el intercambio de datos. Se utiliza comúnmente para transmitir información entre una aplicación cliente y un servidor o para transmitir datos entre aplicaciones. JSON representa datos en forma de objetos anidados y listas de objetos, y utiliza una sintaxis clara y fácil de leer basada en llaves { } para definir objetos y corchetes [ ] para definir listas.
Las propiedades de un objeto JSON se representan como pares clave y valor { "nombre" : "Juan" } separados por dos puntos : como se puede ver en el siguiente jemplo:
{
"nombre": "Juan",
"edad": 30,
"direccion": {
"calle": "Calle Falsa",
"numero": "123",
"ciudad": "Buenos Aires"
},
"hobbies": ["futbol", "pintura", "viajes"]
}
¿ Cómo funciona JSON Extractor en JMeter ? #
En JMeter, JSONPath es un Post-procesador que permite extraer valores específicos de una respuesta JSON. Para ello debemos seguir los siguientes pasos:
- Agregue un elemento HTTP Request o Dummy Sampler a su plan de prueba de JMeter para realizar una solicitud HTTP y recibir una respuesta JSON.
- Agregue un extractor JSON Extractor al elemento antes mencionado, este extractor se encargará de extraer los valores específicos que se necesitan de la respuesta JSON.
- Configure los campos requeridos en el post-procesador JSON Extractor como se muestra en la siguiente tabla:
Atributo | Descripción | Requerido |
---|---|---|
Nombre | Nombre descriptivo para este elemento que se muestra en el árbol. | No |
Aplicar a | Útil para su uso con muestreadores que pueden generar sub-muestras, como el muestreador HTTP con recursos incrustados o las muestras generadas por el controlador de transacciones. Muestra principal solamente: solo se aplica a la muestra principal Solo sub-muestras: solo se aplica a las sub-muestras Muestra principal y sub-muestras: se aplica a ambas Nombre de la variable JMeter a utilizar: la extracción se aplicará al contenido de la variable nombrada | Sí |
Nombres de las variables creadas | Nombres separados por punto y coma de las variables que contendrán los resultados de las expresiones JSONPath (deben coincidir con el número de expresiones JSONPath) | Sí |
Expresiones JSON Path | Expresiones JSONPath separadas por punto y coma (deben coincidir con el número de variables) | Sí |
Valores predeterminados | Valores predeterminados separados por punto y coma si las expresiones JSONPath no devuelven ningún resultado (deben coincidir con el número de variables) | No |
Números de coincidencias | Para cada expresión JSON Path, si la consulta JSON Path tiene muchos resultados, puedes elegir cuál(es) extraer como variables: 0: significa aleatorio (valor predeterminado) -1: significa extraer todos los resultados, se llamarán como <nombre de la variable>_N (donde N va de 1 al número de resultados) X: significa extraer el resultado X (enésimo). Si este X (enésimo) es mayor que el número de coincidencias, no se devuelve nada. Se utilizará el valor predeterminado Los números deben darse como una lista separada por punto y coma. La cantidad de elementos en esa lista debe coincidir con el número de expresiones JSON Path dadas. Si se deja vacío, el valor 0 se utilizará como predeterminado para cada expresión. | No |
Calcular la variable de concatenación | Si se encuentran muchos resultados, el complemento los concatenará utilizando el separador ‘,’ y lo almacenará en una variable llamada <nombre de la variable>_ALL | No |
Ejemplo:
{
"nombre": "Juan",
"edad": 30,
"direccion": {
"calle": "Calle Falsa",
"numero": "123",
"ciudad": "Buenos Aires"
},
"hobbies": ["futbol", "pintura", "viajes"]
}
Podemos utilizar la siguiente expresión JSONPath para extraer estos valores:
$.nombre //Juan
$.edad //30
$.direccion.calle //Calle Falsa
$.direccion.numero //123
$.direccion.ciudad //Buenos Aires
$.hobbies //["futbol","pintura","viajes"]
¿ Qué es JSONPath Query ? #
JSONPath Query es un lenguaje de consulta utilizado para acceder y manipular datos en documentos JSON. Es similar a JSONPath, pero utiliza una sintaxis ligeramente diferente. JSONPath Query admite una variedad de funciones y operadores que permiten realizar consultas más complejas en objetos JSON. Por ejemplo, la expresión $.hobbies[?(@=='pintura')] devolvería un arreglo si el objeto JSON tiene pintura como uno de sus hobbies.
¿ Qué otros ejemplos de uso pudiera tener JSONPath Query ? #
Supongamos un ejemplo más complejo, como el siguiente:
[{
"name": "John Doe",
"age": 35,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "WA"
},
"phoneNumbers": [
{
"type": "mobile",
"number": "555-551-1234"
},
{
"type": "home",
"number": "555-552-5678"
}
],
"email": "john.doe@example.com"
},{
"name": "Peter Doe",
"age": 34,
"address": {
"street": "123 Second St",
"city": "RacconCity",
"state": "TX"
},
"phoneNumbers": [
{
"type": "mobile",
"number": "555-553-1234"
},
{
"type": "home",
"number": "555-554-5678"
}
],
"email": "peter.doe@example.com"
},{
"name": "Rick Doe",
"age": 36,
"address": {
"street": "123 Third St",
"city": "Springfield",
"state": "NJ"
},
"phoneNumbers": [
{
"type": "mobile",
"number": "555-555-1234"
},
{
"type": "home",
"number": "555-556-5678"
}
],
"email": "rick.doe@example.com"
}]
Para este ejemplo, supogamos que deseamos evaluar y extraer los siguiente datos:
Expresión | Resultado |
---|---|
$[0].name | devuelve el nombre del primer objeto, John Doe. |
$[1].phoneNumbers[0].phoneNumbers | devuelve el número de teléfono del segundo objeto, 555-553-1234. |
$[2].address.state | devuelve el estado de la dirección del tercer objeto, NJ. |
devuelve todos los correos electrónicos en el objeto JSON. | |
$[*].phoneNumbers[?(@.type=='mobile')].number | devuelve todos los números de teléfono móvil. |
$[*].age | devuelve todas las edades en el objeto JSON. |
$[?(@.name=='Rick Doe')].address.city | devuelve la ciudad de la dirección de Rick Doe, Anytown. |
$[?(@.age>35)].name | devuelve los nombres de personas mayores de 35 años. |
$[?(@.phoneNumbers[0].number=='555-551-1234')].name | devuelve el nombre del teléfono , John Doe. |
$[?(@.address.state=='TX')].phoneNumbers[*].number | devuelve los teléfonos para las personas que viven en Texas. |
$[?(@.address.city contains 'Anytown')].name | devuelve el nombre de los que vivan en la ciudad Anytown. |
$[?(@.age > 30 && @.address.state == 'TX')] | devuelve la edad es mayor de 30 y la dirección es de TX. |
$..age.min() | devuelve el valor mínimo de la propiedad age, que es 34. |
$..age.max() | devuelve el valor máximo de la propiedad age, que es 36. |
$..age.sum() | devuelve la suma de la propiedad age, que es 105. |
$.phoneNumbers.length() | devuelve la longitud phoneNumbers, que es 2. |
Para evaluar estas sentencias, te recomiendo utilizar un receptor View results tree y utilizar la vista en JSON Path Tester e introducir la sentencia en el campo JSON Path Expression y dar click en el boton Test
Conclusión #
JSONPath y JSONPath Query son herramientas muy poderosas para extraer un valor o multiples valores o evaluación de los mismos para satisfacer uno o varios criterios, recuerda siempre practicar antes de desarrollar tu sentencia o expression. Siempre es bueno verificar los criterios ante varios tipos de respuestas diferentes para obtener resultados contundentes. Hay que practicar, hasta la próxima!