JSONata para Node-RED

JSONata es un lenguaje de consulta y transformación de objetos JSON

Las estructuras de datos son uno de los elementos más importantes de cualquier lenguaje de programación. Nos permite estructurar los datos de manera consistente y realizar operaciones que requieren algunos patrones. Sin un patrón, es difícil para cualquier desarrollador encontrar una forma eficiente de extraer o manipular los datos. JSON es un formato muy conocido que la mayoría de nosotros usamos todos los días. Al trabajar con él, hay operaciones que hacemos habitualmente, como consultar, filtrar, ordenar, agrupar y otras.

JSONata es un lenguaje ligero de consulta y transformación para datos JSON. Inspirado en la semántica de ‘location path’ de XPath 3.1, permite expresar consultas sofisticadas en una notación compacta e intuitiva. Se proporciona un rico complemento de operadores y funciones incorporados para manipular y combinar datos extraídos, y los resultados de las consultas se pueden formatear en cualquier estructura de salida JSON utilizando un objeto JSON familiar y una sintaxis de array. Junto con la posibilidad de crear funciones definidas por el usuario, se pueden crear expresiones avanzadas para abordar cualquier tarea de transformación y consulta JSON.

Web: https://jsonata.org/

Documentación: http://docs.jsonata.org/overview.html

Más información:

Para admitir la extracción de valores de una estructura JSON, se define una sintaxis de ruta de ubicación. Al igual que XPath, esto seleccionará todos los valores posibles en el documento que coincidan con la ruta de ubicación especificada. Las dos construcciones estructurales de JSON son objetos y arrays.

Un objeto JSON es una matriz asociativa. La sintaxis de la ruta de ubicación para navegar en una estructura profundamente anidada de objetos JSON comprende los nombres de campo separados por un punto ‘.’ delimitadores. La expresión devuelve el valor JSON al que se hace referencia después de navegar al último paso en la ruta de ubicación. Si durante la navegación de la ruta de ubicación, no se encuentra un campo, la expresión no devuelve nada (representado por Javascript undefined). No se producen errores como resultado de datos no existentes en el documento de entrada.

Ejemplos en:

Los arrays JSON se utilizan cuando se requiere una colección ordenada de valores. Cada valor de la matriz está asociado con un índice (posición) en lugar de un nombre, por lo que para abordar valores individuales en una matriz, se requiere sintaxis adicional para especificar el índice. Esto se hace usando corchetes después del nombre de campo de la matriz. Si los corchetes contienen un número o una expresión que se evalúa como un número, entonces el número representa el índice del valor a seleccionar. Los índices tienen un desplazamiento cero, es decir, el primer valor de una matriz arr es arr [0]. Si el número no es un número entero, entonces se redondea a un número entero. Si la expresión entre corchetes no es numérica o es una expresión que no se evalúa como un número, entonces se trata como un predicado.

Los índices negativos cuentan desde el final de la matriz, por ejemplo, arr [-1] seleccionará el último valor, arr [-2] el penúltimo, etc. Si se especifica un índice que excede el tamaño de la matriz, entonces no se selecciona nada.

Si no se especifica ningún índice para una matriz (es decir, no hay corchetes después de la referencia del campo), se selecciona toda la matriz. Si la matriz contiene objetos y la ruta de ubicación selecciona campos dentro de estos objetos, se consultará cada objeto dentro de la matriz para su selección.

Ejemplos en:

Predicate Expressions

En cualquier paso de una ruta de ubicación, los elementos seleccionados se pueden filtrar utilizando un predicado – [expr] donde expr se evalúa como un valor booleano. Cada elemento de la selección se compara con la expresión, si se evalúa como verdadero, entonces el elemento se mantiene; si es falso, se elimina de la selección. La expresión se evalúa en relación con el elemento actual (contexto) que se está probando, por lo que si la expresión de predicado realiza la navegación, entonces es relativa a este elemento de contexto.

Ejemplos:

  • Account.Order.Product.[ProductID=858383]
  • Account.Order.Product[ProductID=858383].`Product Name`

Ejemplos en:

Comodines

Uso de * en lugar del nombre del campo para seleccionar todos los campos de un objeto.

El comodín descendiente ** en lugar de * atravesará todos los descendientes (comodín de varios niveles).

Al procesar el valor de retorno de una expresión JSONata, podría ser conveniente tener los resultados en un formato coherente, independientemente de cuántos valores coinciden, es decir, forzar a que devuelva un array de valores. La expresión se puede modificar para que devuelva un array incluso si solo se coincide con un valor único. Esto se hace agregando corchetes vacíos [] a un paso dentro de la ruta de ubicación.

Funciones y Expresiones

Strings

Las expresiones de ruta que apuntan a un valor de cadena (string) devolverán ese valor.

Los literales de strings también se pueden crear encerrando la secuencia de caracteres entre comillas. Se pueden utilizar comillas dobles » o comillas simples ‘, siempre que se utilice el mismo tipo de comillas para el inicio y el final del literal de cadena. Los caracteres de comillas simples se pueden incluir dentro de una cadena de comillas dobles y viceversa sin escapar. Caracteres dentro del string se puede escapar utilizando el mismo formato que las cadenas JSON.

Las cadenas se pueden combinar utilizando el operador de concatenación &. Este operador unirá las dos cadenas devueltas por las expresiones a cada lado. Este es el único operador que intentará forzar sus operandos al tipo esperado (cadena).

Numéricos

Los literales numéricos también se pueden crear utilizando la misma sintaxis que los números JSON. Los números se pueden combinar utilizando los operadores matemáticos habituales para producir un número resultante. Operadores admitidos:

  • + suma
  • – resta
  • * multiplicación
  • / división
  • % resto (módulo)

$number pasa a número el dato y poder operar en JSONata

Comparación

Se utiliza a menudo en predicados, para comparar dos valores. Devuelve un valor booleano verdadero o falso. Operadores admitidos:

  • = igual
  • ! = no es igual
  • < menor que
  • <= menor o igual que
  • > mayor que
  • > = mayor o igual que
  • in valor está contenido en una matriz

Booleanos

Se utiliza para combinar resultados booleanos, a menudo para admitir expresiones de predicado más sofisticadas. Operadores admitidos:

  • and
  • or

Ejemplo: $[data.age > 16 and data.age < 20]

Tenga en cuenta que not se admite como función, no como operador.

Ejemplos en:

Otras tareas que se pueden realizar:

  • Ordenar
  • Hacer funciones
  • Trabajar con fechas
  • Trabajar con strings
  • etc…

2 comentarios en “JSONata para Node-RED

  1. Pingback: JSONata para Node-RED -

  2. Pingback: Diario del Curso IoT, Smart Cities y Node-RED | Aprendiendo Arduino

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.