JSON_ARRAY

La función JSON_ARRAY construye un array JSON a partir de una lista de valores. Es la forma programática de crear arrays en MySQL, más segura que escribir la cadena JSON a mano, porque se encarga automáticamente de escapar caracteres especiales y garantizar un formato válido. Cada argumento que le pases se convertirá en un elemento del array resultante.

Sintaxis

JSON_ARRAY(valor1, valor2, ..., valorN)

La función acepta cero o más argumentos de cualquier tipo. Los valores SQL se convierten automáticamente a sus equivalentes JSON: las cadenas se entrecomillan, los números se mantienen como números, los booleanos se convierten a true/false, y los NULL de SQL se convierten al literal null de JSON.

Comportamiento básico

Un array simple con diferentes tipos de valores:

SELECT JSON_ARRAY('MySQL', 8.0, TRUE, NULL) AS resultado;
resultado
["MySQL", 8.0, true, null]

Observa cómo MySQL convierte cada tipo de dato automáticamente. La cadena 'MySQL' se entrecomilla con comillas dobles (estándar JSON), el número decimal se mantiene, el booleano TRUE de SQL se convierte en true de JSON, y el NULL de SQL se convierte en el literal null de JSON.

Un array vacío se crea llamando a la función sin argumentos:

SELECT JSON_ARRAY() AS array_vacio;
array_vacio
[]

Arrays con tipos mixtos y anidados

La flexibilidad de JSON permite mezclar tipos en un mismo array, algo imposible con los tipos de datos tradicionales de SQL:

SELECT JSON_ARRAY(
    'Producto A',
    49.99,
    TRUE,
    JSON_ARRAY('rojo', 'azul', 'verde')
) AS mixto;
mixto
["Producto A", 49.99, true, ["rojo", "azul", "verde"]]

El cuarto elemento es un array anidado. JSON_ARRAY detecta que el argumento ya es de tipo JSON y lo incluye directamente sin convertirlo a cadena.

Caso práctico: construir arrays desde columnas

Uno de los usos más frecuentes de JSON_ARRAY es agrupar valores de varias columnas en un solo array por fila:

CREATE TABLE empleados (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100),
    puesto VARCHAR(100),
    departamento VARCHAR(50),
    salario DECIMAL(10,2)
);
 
INSERT INTO empleados (nombre, puesto, departamento, salario) VALUES
('Ana García', 'Desarrolladora Senior', 'Ingeniería', 55000.00),
('Carlos López', 'Product Manager', 'Producto', 52000.00),
('Elena Ruiz', 'Diseñadora UX', 'Diseño', 45000.00),
('Miguel Torres', 'DevOps Engineer', 'Ingeniería', 58000.00);
SELECT JSON_ARRAY(nombre, puesto, salario) AS datos_empleado
FROM empleados
WHERE departamento = 'Ingeniería';
datos_empleado
["Ana García", "Desarrolladora Senior", 55000.00]
["Miguel Torres", "DevOps Engineer", 58000.00]

Cada fila produce un array con los valores de las columnas seleccionadas. Esto es útil cuando necesitas enviar datos en formato JSON a una aplicación frontend.

Imaginemos que tenemos las etiquetas de productos en una tabla relacional y necesitamos convertirlas a arrays JSON:

CREATE TABLE productos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(200) NOT NULL,
    precio DECIMAL(10,2)
);
 
CREATE TABLE etiquetas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    producto_id INT,
    etiqueta VARCHAR(50),
    FOREIGN KEY (producto_id) REFERENCES productos(id)
);
 
INSERT INTO productos (nombre, precio) VALUES
('Auriculares Bluetooth', 79.99),
('Cargador USB-C 65W', 35.99),
('Funda portátil 15"', 24.99);
 
INSERT INTO etiquetas (producto_id, etiqueta) VALUES
(1, 'audio'), (1, 'bluetooth'), (1, 'inalámbrico'),
(2, 'cargador'), (2, 'usb-c'), (2, 'rápido'),
(3, 'protección'), (3, 'portátil');

Con JSON_ARRAYAGG (la versión agregada de JSON_ARRAY) puedes agrupar las etiquetas de cada producto:

SELECT
    p.nombre,
    p.precio,
    JSON_ARRAYAGG(e.etiqueta) AS etiquetas
FROM productos p
JOIN etiquetas e ON p.id = e.producto_id
GROUP BY p.id, p.nombre, p.precio;
nombreprecioetiquetas
Auriculares Bluetooth79.99["audio", "bluetooth", "inalámbrico"]
Cargador USB-C 65W35.99["cargador", "usb-c", "rápido"]
Funda portátil 15"24.99["protección", "portátil"]

Mientras JSON_ARRAY trabaja con valores individuales en una sola fila, JSON_ARRAYAGG agrega valores de múltiples filas en un solo array.

Caso práctico: construir respuestas JSON para una API

Cuando tu aplicación necesita devolver respuestas JSON directamente desde MySQL, puedes combinar JSON_ARRAY con JSON_OBJECT:

SELECT JSON_OBJECT(
    'id', id,
    'nombre', nombre,
    'precio', precio,
    'moneda', 'EUR',
    'disponibilidad', JSON_ARRAY('online', 'tienda_fisica', 'marketplace')
) AS respuesta_api
FROM productos
WHERE id = 1;
respuesta_api
{"id": 1, "nombre": "Auriculares Bluetooth", "precio": 79.99, "moneda": "EUR", "disponibilidad": ["online", "tienda_fisica", "marketplace"]}

El array disponibilidad se integra perfectamente dentro del objeto porque JSON_ARRAY devuelve un valor de tipo JSON nativo.

Manejo de NULL

Cuando alguno de los argumentos es NULL, se incluye como null en el array JSON:

SELECT JSON_ARRAY('primero', NULL, 'tercero') AS con_null;
con_null
["primero", null, "tercero"]

El NULL de SQL se convierte al literal null de JSON, no se omite. Si necesitas excluir los valores nulos del array, deberás construirlo condicionalmente en tu aplicación o usar una subconsulta que filtre los nulos antes de agregarlos.

Combinación con otras funciones

JSON_ARRAY se combina naturalmente con las demás funciones JSON. Puedes usar arrays creados con JSON_ARRAY como argumentos para JSON_CONTAINS, JSON_ARRAY_APPEND o almacenarlos directamente en columnas JSON:

-- Insertar con array dinámico
INSERT INTO productos (nombre, precio) VALUES ('Hub USB', 19.99);

También puedes usar JSON_ARRAY para crear arrays de arrays, lo que resulta útil para representar matrices o datos tabulares:

SELECT JSON_ARRAY(
    JSON_ARRAY('Producto', 'Precio', 'Stock'),
    JSON_ARRAY('Teclado', 89.99, 150),
    JSON_ARRAY('Ratón', 45.00, 200),
    JSON_ARRAY('Monitor', 349.99, 30)
) AS tabla_json;
tabla_json
[["Producto", "Precio", "Stock"], ["Teclado", 89.99, 150], ["Ratón", 45.00, 200], ["Monitor", 349.99, 30]]

En el siguiente artículo veremos JSON_OBJECT para crear objetos JSON.

Escrito por Eduardo Lázaro