Entendiendo la recursividad en JSONata
Este artículo presenta un ejemplo que define recursividad para navegar y transformar una estructura JSON. Se detallará el ejemplo inicial y se expandirá con explicaciones adicionales, ejemplos prácticos y casos de uso, proporcionando una comprensión completa de la recursividad en JSONata
(
$person := function($node) { $node.{"n": Name, "p":$person(Parent.Person)}};
{
"Person": Person ~> $person($)
}
)Explicación:
1. Definición de la Función:
La línea anterior define una función recursiva llamada $person. La función recibe un nodo ($node) como argumento y devuelve un objeto que contiene:
"n": Name – La propiedad Name del nodo actual.
"p": $person(Parent.Person) – El resultado de llamar a la función $person sobre la propiedad Parent.Person del nodo actual, lo que permite una navegación recursiva.
2. Aplicación de la Función:
Esta parte aplica la función $person al campo "Person" del contexto actual (denotado por $). El operador ~> canaliza el campo "Person" a través de la función $person.
Incrementando el Ejemplo
Mejoraremos el ejemplo añadiendo más campos para la transformación y navegando en estructuras JSON más profundamente anidadas. Considera la siguiente estructura JSON más compleja:
JSON de Entrada
Función Expandida
Modifiquemos la función para incluir la propiedad "Age" y manejar los casos en los que "Parent" pueda estar ausente.
Explicación
La función modificada ahora incluye "a": Age para capturar la edad de cada persona.
El operador ternario ($exists($person(Parent.Person)) ? ... : null) garantiza que la función devuelva "null" si el nodo no está presente, evitando errores al navegar por la jerarquía.
Ejemplo de salida
Aplicar la consulta ampliada al ejemplo de entrada JSON dará como resultado:
Ejemplos adicionales y casos de uso
Ejemplo con hermanos
Consideremos un ejemplo en el que cada persona puede tener hermanos.
JSON de entrada
Función ampliada y consulta para manejar hermanos
Podemos ampliar aún más nuestra función para incluir a los hermanos:
Explicación
La línea "s": $exists($person(Siblings)) ? $person(Siblings) : null mapea el arreglo Siblings y transforma a cada hermano en un objeto.
Ejemplo de salida
Aplicar la consulta ampliada al ejemplo de entrada JSON dará como resultado:
Conclusión
La función recursiva en JSONata permite navegar y transformar estructuras JSON anidadas de forma poderosa. Con estas funciones, es posible recorrer jerarquías, manejar campos opcionales y mapear arrays para producir transformaciones complejas y automatizadas.
Last updated