Por qué convertir JSON a Excel no es una transformación trivial
JSON es un formato de datos con tipos y anidamiento: un mismo archivo puede contener objetos, arrays, números, booleanos, valores nulos y cadenas. Una hoja de cálculo, por el contrario, es plana: cada celda ocupa una fila y una columna, y no existe una forma nativa de representar jerarquías. Convertir JSON a Excel (XLSX) exige, por tanto, un paso intermedio de aplanamiento que no es necesario cuando se parte de CSV o de Excel, formatos ya tabulares.
El aplanamiento que aplica esta herramienta consiste en expandir cada objeto anidado usando nombres de columna con rutas de puntos. Por ejemplo, un campo direccion que a su vez contiene calle y codigo_postal da lugar a las columnas direccion.calle y direccion.codigo_postal. Este mecanismo es una decisión de diseño deliberada: permite conservar la trazabilidad del origen de cada dato dentro de la jerarquía original, aunque el resultado sea un conjunto de columnas más extenso que el de un JSON simple.
El formato de salida, XLSX, es un libro de trabajo XML comprimido en un archivo ZIP. A diferencia de CSV, que reduce todos los valores a texto, XLSX puede almacenar de forma nativa números y booleanos. La herramienta no escribe fórmulas ni estilos de celda; vuelca únicamente los datos visibles y estáticos del JSON de entrada. Solo se lee la primera hoja del archivo de entrada y la hoja de salida se nombra Sheet1.
Cómo funciona el aplanamiento de estructuras JSON anidadas
La herramienta considera que el JSON de entrada debe tener forma de tabla. La forma más habitual es un array de objetos: cada objeto del array se convierte en una fila, y las claves de esos objetos se convierten en los encabezados de las columnas. Si un objeto contiene otro objeto anidado, las claves internas se expanden con la ruta de puntos ya mencionada.
Veamos un ejemplo concreto. El siguiente JSON:
[
{
"id": 1,
"nombre": "Ana",
"direccion": {
"ciudad": "Madrid",
"codigo_postal": 28001
},
"activo": true
},
{
"id": 2,
"nombre": "Luis",
"direccion": {
"ciudad": "Barcelona",
"codigo_postal": 08001
},
"activo": false
}
]
Se transforma en una tabla con las columnas:
id, nombre, direccion.ciudad, direccion.codigo_postal, activo.
Si el JSON de entrada es un array de arrays, la herramienta lo trata como filas completas: cada subarray se convierte en una fila, y la primera fila del array puede servir como encabezado o no, según la estructura. El caso más común sigue siendo el array de objetos.
¿Qué ocurre con los valores nulos o ausentes? Si una clave no existe en un objeto o su valor es null, la celda correspondiente queda vacía. Si dos objetos dentro del mismo array tienen claves diferentes, el conjunto de columnas se unifica: aparecen todas las claves presentes en cualquier objeto, y las celdas de los objetos que carezcan de esa clave se dejan vacías. Esto es coherente con el comportamiento de una tabla relacional.
Arrays dentro de objetos: si un valor es un array de primitivas (ej. ["rojo", "azul"]), la herramienta lo convierte en una cadena con la representación JSON de ese array (ej. "" como cadena). Los arrays de objetos dentro de un objeto no se expanden en filas separadas; en su lugar, el array completo se convierte en una cadena JSON y se coloca en una sola celda. Este es un límite inherente a cualquier conversión de JSON jerárquico a tabla plana.
Requisitos de entrada y tipos de datos aceptados
La herramienta acepta un único archivo JSON por operación. El archivo debe cumplir dos condiciones: ser JSON válido sintácticamente y tener una estructura que pueda interpretarse como una tabla. Esto último significa que el contenido de nivel superior debe ser un array (de objetos o de arrays). Un objeto suelto sin array circundante no se considera «en forma de tabla» y genera el error: «This JSON is invalid or not table‑shaped.»
Además, el archivo debe tener al menos una fila de datos. Si el array está vacío, aparece el error: «This file has no table rows.» También existen límites de tamaño, número de filas y número de columnas. El tamaño máximo del archivo es de 8 MB. Si se supera, el mensaje es: «This file is too large. Use a file under ‹max›.» El límite de filas es de 10.000 y el de columnas es de 200. Una conversión que exceda los 12 segundos se detiene con el mensaje: «This conversion is taking too long. Try a smaller file.»
La herramienta permite arrastrar el archivo o seleccionarlo mediante el diálogo del sistema. Si el formato no es CSV, JSON o XLSX, se muestra: «Choose a CSV, JSON or XLSX file.»
Conservación de tipos de datos: JSON frente a XLSX
Una de las ventajas de convertir a XLSX es la preservación de los tipos primitivos. JSON distingue entre números (enteros y decimales), booleanos (true / false), cadenas, nulos, objetos y arrays. La herramienta asigna los siguientes tipos en las celdas XLSX:
| Tipo JSON | Tipo en XLSX | Notas |
|---|---|---|
| number | Número | Se conserva el valor exacto, incluyendo decimales. |
| boolean | Booleano | Se escribe como VERDADERO/FALSO en la celda (formato booleano nativo). |
| string | Texto (cadena) | Sin cambios. |
| null | Celda vacía | No se escribe ningún valor. |
| object | No aplica | Se descompone en columnas con rutas de puntos. |
| array | Texto o se ignora | Si es un array de primitivos, se convierte en una cadena JSON. Si es un array de objetos anidados, se serializa como texto JSON. |
La ausencia de conversión a texto es relevante para hojas de cálculo que necesiten realizar cálculos. Si el JSON contiene "precio": 19.99, la celda contendrá el número 19.99, no la cadena "19.99". Lo mismo ocurre con los booleanos: "activo": true produce una celda booleana, no un texto.
¿Qué ocurre con los números muy grandes? XLSX maneja números de punto flotante de 64 bits, igual que JSON. No hay pérdida significativa para valores dentro del rango de la IEEE 754. Sin embargo, números enteros extremadamente largos (más de 15 dígitos significativos) pueden redondearse al escribirse en la hoja. Es un límite del formato, no de la herramienta.
Procesamiento local y privacidad de datos
Toda la conversión se ejecuta en el navegador del usuario. No se envía el archivo JSON a ningún servidor. Esto implica que los datos permanecen en el equipo local durante todo el proceso, lo cual es relevante para quienes manejan información sensible (datos personales, credenciales de API, configuraciones internas). El navegador analiza el archivo y escribe el resultado convertido localmente en el dispositivo. El único momento en que el archivo sale del ordenador es cuando el usuario lo descarga explícitamente.
Este enfoque tiene una consecuencia práctica: el tamaño del archivo que se puede procesar está limitado. Los archivos grandes pueden agotar la memoria y provocar el error: «This conversion is taking too long. Try a smaller file.».
La página impone límites prácticos para evitar que el navegador se bloquee:
- Límite de tamaño de archivo: 8 MB. Los archivos más grandes son rechazados con el mensaje: «This file is too large. Use a file under ‹max›.».
- Límite de filas: 10.000 filas.
- Límite de columnas: 200 columnas.
- Tiempo de espera: una conversión que supera los 12 segundos se detiene con el mensaje: «This conversion is taking too long. Try a smaller file.».
- Cancelación: el usuario puede cancelar la conversión, lo que activa el mensaje: «Conversion cancelled.».
Limitaciones y casos límite
La herramienta produce una sola hoja de cálculo. No es posible dividir los datos en varias hojas según un campo, ni crear tablas dinámicas. Tampoco se conservan fórmulas ni estilos.
Deep nesting: Si un JSON tiene muchos niveles de anidamiento, el número de columnas puede crecer rápidamente. Por ejemplo, un objeto con tres niveles de profundidad como usuario.perfil.contacto.telefono genera una columna con ese nombre largo. Si hay una gran variabilidad entre objetos, muchas columnas pueden quedar casi vacías, produciendo una tabla dispersa.
Arrays dentro de arrays: Un JSON que sea un array de arrays (matriz) se convierte directamente en filas y columnas, sin encabezados generados automáticamente. La primera fila del array puede no ser tratada como encabezado, lo que obliga al usuario a añadirlos manualmente después.
Errores por tiempo de espera: Si la conversión tarda más de 12 segundos, se detiene con el mensaje This conversion is taking too long. Try a smaller file.. La herramienta no ofrece una forma de reanudar; hay que empezar de nuevo con un archivo más pequeño.
Valores nulos frente a cadenas vacías: En JSON, null es un valor explícitamente ausente. Una cadena vacía "" es un valor de tipo string. La herramienta diferencia ambos: el nulo deja la celda vacía; la cadena vacía escribe una celda de texto sin contenido (visible como celda en blanco, pero con tipo texto). En Excel, esto puede afectar a fórmulas como CONTARA o CONTAR.SI.
Preguntas frecuentes
1. ¿Qué ocurre si mi JSON tiene un array de objetos dentro de un objeto? Ese array interno se serializa como una cadena JSON y se coloca en una sola celda. Si necesitas cada elemento en su propia fila, debes pre-aplanar los datos antes de subirlos.
2. ¿Se conservan los números con decimales exactos? Sí, siempre que no superen los límites de precisión del formato XLSX (aproximadamente 15 dígitos significativos). Números como 0.1 se almacenan como tal.
3. ¿El archivo se sube a un servidor? No. Todo el procesamiento ocurre en el navegador. Los datos no salen de tu ordenador hasta que tú descargas el archivo XLSX.
4. ¿Puedo convertir un JSON que contenga una sola fila (un único objeto)?
Sí. Un solo objeto se convierte en una tabla de una fila: sus claves se convierten en las columnas. Envolverlo entre corchetes ([{...}]) da el mismo resultado.
5. ¿Por qué algunas columnas aparecen con puntos en el nombre, como direccion.calle?
Es el método de aplanamiento. Los puntos indican que el valor original estaba dentro de un objeto anidado. Así se preserva la jerarquía original en un formato plano. Puedes renombrar las columnas después en Excel si lo prefieres.
6. ¿Qué pasa si el JSON tiene una clave con un punto en su nombre?
La herramienta añade los puntos de separación de anidamiento, por lo que una clave ya existente con punto (ej. "nombre.apellido") se mezclaría con la notación de ruta. No hay escape definido; es un caso límite que puede causar ambigüedad. Se recomienda evitar claves con puntos en el JSON de origen.