Consultas -SQL Like- a estructuras en JSON con JSONPath

Los dispositivos móviles y tablets de uso popular hoy han exigido que el interfaz de usuario sea prioritario a la hora de desarrollar una aplicación web o nativa, compitiendo muchas veces con la productividad de la misma. Por esto y por buscar otras alternativas al almacenamiento de datos estructurados han surgido muchas soluciones que nos facilitan el desarrollo de aplicaciones hoy día.

Una de estas soluciones lo es la estructura JSON (JavaScript Object Notation); consiste en un formato ligero de intercambio de datos que permite administrar grandes volúmenes de datos en formato de texto.

JSON se ha estandarizado como el formato de intercambio por excelencia para aplicaciones con alto detalle estético y de volumen de datos, permitiendo la integración de los resultados de la programación o scripting de lado servidor con el lado cliente.

Esto no solo ha facilitado el desarrollo de aplicaciones, sino también, ha permitido mayor rapidez y flujo de las mismas permitiendo capturar no solo registros, ademas, estructuras de interfaz de forma dinámica lo que a su vez permite mayor personalización de las aplicaciones sin necesidad de volver a cargar archivos o ejecutar nuevas consultas a las bases de datos.

Ahora bien, JSON ha sido utilizado en forma combinada, es decir, no se aprovecha al máximo debido a que por lo general utilizamos JSON solo para mostrar u obtener resultados de consultas SQL en el lenguaje de ejecución en servidor para ser utilizados dentro de interfaces Javascript.

Por ejemplo, queremos obtener la información de un usuario para colocar dichos datos en una pantalla o formulario. Pero que ocurre cuando necesitamos obtener datos específicos como actualizar un carrito de compras o una selección de libros, fotos, etc. Como nos ayudaría, poder ejecutar consultas directamente al objeto JSON en memoria sin necesidad de volver a ejecutar una consulta al servidor ni refrescar pantalla o ejecutar acciones de POST y GET? La respuesta: mejora de desempeño, menos utilización de recursos físicos y lógicos ya que contamos con la estructura del lado cliente.

Esto es posible con JSONPath. Esta librería de apenas 4kb provee todo lo necesario para trabajar de manera dinámica con objetos JSON tanto en Javascript como en PHP. Para este articulo vamos a trabajar la versión javascript en nuestros ejemplos.

Implementar jsonpath requiere la siguiente estructura:

jsonPath(obj, expr [, args])

Lo primero es incluir nuestra librería JSONPath a nuestro proyecto de la misma forma que incluimos cualquier librería externa de javascript. Descargamos el archivo y lo incluimos en nuestro poryecto y hacemos el enlace o llamada al archivo en nuestro head tag:

<script src=”public/js/jsonpath.js” type=”text/javascript”></script>

Una ves realizada la inclusión lo siguiente es tener nuestra estructura JSON de datos a ser concultados. para este ejemplo vamos a utilizar la siguiente estructura:

{ “store”: {
“book”: [
{ “category”: “reference”,
“author”: “Nigel Rees”,
“title”: “Sayings of the Century”,
“price”: 8.95
},
{ “category”: “fiction”,
“author”: “Evelyn Waugh”,
“title”: “Sword of Honour”,
“price”: 12.99,
“isbn”: “0-553-21311-3”
}
],
“bicycle”: {
“color”: “red”,
“price”: 19.95
}
}
}

Por último solo necesitamos realizar las consultas de los datos que necesitamos. JSONPath cuenta con una sintaxis bastante sencilla y robusta para no solo realizar consultas especificas, sino también, para realizar filtrados:

Todos los autores:

var authors = jsonPath(json, "$.store.book[*].author");

Autor del primer libro de la lista:

var author = jsonPath(json, "$.store.book[1].author");

Todos los libros en la categoría “reference”

var books = jsonPath(json, "$.store.book[?(@.category == 'reference')]"); var books = jsonPath(json, "$.store.book[?]", filter(where("category").is("reference")));

Todos los libros que cuestan mas de 10 pesos

var books = jsonPath(json, "$.store.book[?(@.price > 10)]"); var books = jsonPath(json, "$.store.book[?]", filter(where("price").gt(10)));

Todos los libros que tienen isbn

var books = jsonPath(json, "$.store.book[?(@.isbn)]"); var books = jsonPath(json, "$.store.book[?]", filter(where("isbn").exists(true)));

——————————–

Los resultados de JSONPath pueden ser un objeto JSON o un string desciptivo dependiendo cómo especifiquemos que queremos el resultado mediante el parámetro resultType, el cual puede tener los valores VALUE o PATH, respectivamente.

Para mas información sobre esta librería visita la web: JSONPath

También puedes utilizar este estupendo explorador en linea para hacer pruebas y aprender como utilizar JSONPath.