Json en Postgres

JSON o Javascript Object Notation es un formato de archivo que permite la representación de objetos complejos en el lenguaje de programación Javascript, lo que lo convierte en un estándar de facto para la compartición de datos entre aplicaciones web, APIs y aplicaciones móviles y de escritorio. Muchas veces, es importante obtener el resultado de una llamada a un API y almacenarlo directamente en la base de datos para su posterior análisis o utilización, o es importante que el resultado de una consulta quede formulado directamente en JSON desde el servidor de base de datos sobre todo si nuestra aplicación web cuenta con menos recursos para formatear las respuestas y servir la aplicación. En PostgreSQL existen 2 tipos de datos dedicados para almacenar y operar directamente cadenas de texto en JSON. Estos son los tipos json y jsonb.

El tipo de datos json

Para crear un campo tipo JSON dentro de una tabla lo podemos definir como:

CREATE TABLE api_response (
    id SERIAL PRIMARY KEY,
    api_resp json,
    time_resp timestampz
);

Para cargar un registro json:

INSERT INTO api_response(api_resp)
VALUES
 (
 '{ "customer": "John Doe", "items": {"product": "Beer","qty": 6}}'
 );

Para hacer consultas sobre campos json podemos usar un SELECT normal:

SELECT api_resp FROM api_response;

Para extraer información de un campo json dentro de una consulta se pueden utilizar los operadores -> y ->>.

SELECT
 info -> 'customer' AS customer
FROM
 orders;

El tipo de datos jsonb

jsonb es una representación binaria de las cadenas de json, la cual permite todas las operaciones mencionadas anteriormente mas algunas que aprovchan la representación binaria

La primera opeación es una pruba para saber si un documento, está contennido dentro de otro para esto usamos el operador @> ejemplo:

SELECT '["Fiction", "Thriller", "Horror"]'::jsonb @> '["Fiction", "Horror"]'::jsonb; 

Otra es checar existencia dentro del objeto Esto nos permite saber si existe la llave dentro del objeto:

SELECT COUNT(*) FROM books WHERE data ? 'authors'; 

Otra cualidad importante es que el tipo jsonb nos permite generar índices sobre los campos de la columna:

CREATE INDEX idx_published ON books (data->'published'); 

Conclusiones

Esto fue una breve introducción a las operaciones más comunes que se pueden llevar a cabo con los tipos de datos JSON en PostgreSQL, la documentación oficial de postgres es mucho más precisa y detallada, así que no está de más revisarla.