JSONiq es un lenguaje de consulta y programación funcional diseñado para consultar y transformar de forma declarativa colecciones de datos jerárquicos y heterogéneos en formato JSON , XML , así como datos textuales no estructurados.
JSONiq es una especificación abierta publicada bajo la licencia Creative Commons Atribución- CompartirIgual 3.0. Se basa en el lenguaje XQuery , con el que comparte las mismas expresiones y operaciones básicas sobre tipos atómicos . JSONiq está disponible en dos variantes sintácticas, ambas compatibles de forma nativa con JSON y XML.
- La sintaxis JSONiq (un superconjunto de JSON) se ha ampliado con soporte para XML mediante un subconjunto compatible de XQuery.
- La sintaxis XQuery (compatibilidad nativa con XML) se amplía con compatibilidad con JSON mediante un subconjunto compatible (la extensión JSONiq para XQuery) de la sintaxis JSONiq mencionada anteriormente.
Características
JSONiq proporciona principalmente herramientas para extraer y transformar datos de documentos JSON o de cualquier fuente de datos que pueda considerarse como JSON (por ejemplo, bases de datos relacionales o servicios web ).
La principal forma de realizar estas operaciones es mediante la expresión FLWOR , similar a SQL , que proviene de XQuery. Una expresión FLWOR se construye a partir de las cinco cláusulas que le dan nombre: FOR, LET, WHERE, ORDER BY y RETURN. Sin embargo, también admite cláusulas para agrupar y segmentar.
El lenguaje también proporciona sintaxis para construir nuevos documentos JSON, donde los nombres y valores de los campos se conocen de antemano o se pueden calcular dinámicamente. El lenguaje JSONiq (no la extensión de XQuery) es un superconjunto de JSON. Es decir, cada documento JSON es un programa JSONiq válido.
Además, el lenguaje también admite una sintaxis de navegación para extraer nombres de campos y valores de objetos JSON, así como valores de matrices JSON. La navegación es robusta incluso en ausencia de valores o si estos son heterogéneos, ya que ignora silenciosamente los valores imprevistos sin generar errores.
Todas las construcciones se definen como expresiones dentro del lenguaje y pueden anidarse arbitrariamente.
JSONiq no incluye funciones para actualizar documentos JSON o XML, no dispone de capacidades de búsqueda de texto completo ni admite sentencias condicionales. Todas estas funciones se encuentran en desarrollo activo para una versión posterior del lenguaje.
JSONiq es un lenguaje de programación que permite expresar transformaciones arbitrarias de JSON a JSON o de XML a XML. También permite transformaciones entre JSON y XML. Todas estas transformaciones presentan las siguientes características:
- Independencia de datos lógicos/físicos
- Declarativo
- Alto nivel
- Sin efectos secundarios
- Fuertemente tipificado
Modelo de datos
El lenguaje se basa en el modelo de datos JSONiq (JDM), que es una extensión del modelo de datos XQuery y XPath (XDM). El JDM utiliza un modelo estructurado en árbol del contenido informativo de un documento JSON o XML. Contiene objetos JSON, matrices JSON, todo tipo de nodos XML, así como valores atómicos como enteros, cadenas o booleanos, todos definidos en el esquema XML .
JDM constituye la base de un lenguaje orientado a conjuntos, donde las instancias del modelo de datos son secuencias (un valor único se considera una secuencia de longitud uno). Los elementos de una secuencia pueden ser objetos JSON, matrices JSON, nodos XML o valores atómicos.
Ejemplos
El siguiente código JSONiq de ejemplo calcula el código de área y el número de personas mayores de 20 años a partir de una colección de objetos JSON de tipo persona (consulte el artículo sobre JSON para ver un ejemplo de objeto).
para $ p en la colección ( "personas" ) donde $ p.edad gt 20 sea $ casa := $ p.númeroDeTeléfono [][ $ $. tipo eq "casa" ] . número agrupe por $ área := subcadena-antes ( $ casa , " " ) devuelva { "código de área" : $ área , "conteo" : conteo ( $ p ) }Todas las construcciones de JSONiq son expresiones y también pueden estar contenidas en el cuerpo de una función.
declare function local:adults () { for $ p in collection ( "persons" ) where $ p.age gt 20 return $ p };La siguiente consulta transforma partes de cada objeto persona en un elemento XML utilizando la sintaxis XQuery (extensión JSONiq para XQuery).
para $ p en la colección ( "personas" ) devolver <persona> <nombre> { $ p ( "nombre" )} </nombre> <apellido> { $ p ( "apellido" )} </apellido> <edad> { $ p ( "edad" )} </edad> </persona>Aplicaciones
A continuación se muestran algunos ejemplos de cómo y dónde se puede utilizar JSONiq:
- Extracción de información de una base de datos para su uso en un servicio web.
- Generación de informes resumidos sobre datos almacenados en un repositorio de documentos JSON.
- Seleccionar y transformar datos JSON a XHTML para su publicación en la web.
- Correlacionar datos de diversas fuentes y formatos (por ejemplo, almacén de documentos JSON, base de datos XML, base de datos relacional y servicio web) y ofrecerlos en un servicio web.
- Transformación de colecciones de objetos JSON a un esquema diferente.
Comparación de los dos estilos sintácticos
JSONiq ofrece dos sintaxis, que los usuarios pueden utilizar según si trabajan con JSON o XML. Ambas sintaxis emplean el mismo modelo de datos y son muy similares, salvo algunas excepciones.
Sintaxis JSONiq
La sintaxis pura de JSONiq es un superconjunto de JSON. Estrictamente hablando, no es un superconjunto de XQuery, aunque dispone de todas sus expresiones y semántica. Los siguientes aspectos de la sintaxis de JSONiq no cumplen con el estándar XQuery:
- No se permiten nombres que contengan puntos.
- No. Para el elemento de contexto, se debe usar ($$ en su lugar).
- No se permiten literales entre comillas simples.
- JSON, escape basado en barra invertida en literales de cadena .
- No se permite ningún paso de eje al comienzo de una expresión de ruta relativa.
Sintaxis XQuery con extensión JSONiq
La extensión JSONiq para XQuery es un superconjunto de XQuery, pero no de JSON. Cumple totalmente con la recomendación candidata de XQuery 3.0 y es compatible con versiones anteriores. Los siguientes aspectos de JSONiq no son compatibles con la sintaxis de XQuery.
- No se realiza una búsqueda de objetos basada en puntos ($object(“key”) en su lugar).
- No hay $$ para el elemento de contexto.
- XML, escape de literales de cadena basado en el signo de ampersand.
- Las claves de objeto deben ir entre comillas.
- No se permiten literales verdaderos/falsos/nulos.
- Los tipos atómicos integrados deben ir precedidos de xs:.
- Los tipos no atómicos deben ir seguidos de paréntesis.
- La función empty-sequence() debe escribirse de esta manera.
- Sin búsqueda en matrices ni desempaquetado de matrices [].
Lecturas adicionales
- JSONiq - El SQL de NoSQL. Ghislain Fourny. CreateSpace Independent Publishing Platform. ISBN 1489530371.
Implementaciones
- Zorba : JSONiq y extensión de JSONiq para XQuery
- IBM WebSphere : Extensión JSONiq para XQuery
- Herramientas de Internet BeniBela : Extensión JSONiq para XQuery
Véase también
Referencias
- JSON
- Lenguajes funcionales