JSON es el idioma de las APIs; CSV es el idioma de las hojas de cálculo, las bases de datos y los analistas. Convertir entre ambos es una tarea cotidiana —— exportar una respuesta de API a Excel, o convertir una hoja de cálculo en JSON para importarla. Esta guía muestra cómo convertir JSON a CSV y CSV a JSON, en JavaScript, en Python y al instante en tu navegador —— y los casos límite (datos anidados, comillas, tipos) que más hacen tropezar.
El mapeo central: Array de objetos ⇄ Filas
Un fichero CSV es una tabla: una fila de cabecera con los nombres de columna, luego una fila por registro. La forma JSON que se mapea de manera natural a esa tabla es un array de objetos, donde cada objeto es una fila y cada clave una columna.
// JSON
[
{ "id": 1, "name": "Ada Lovelace", "active": true },
{ "id": 2, "name": "Bob Khan", "active": false }
]# CSV
id,name,active
1,Ada Lovelace,true
2,Bob Khan,falseLa cabecera es la unión de las claves de todos los objetos (así, los objetos con campos distintos siguen alineados), y cada fila toma el valor correspondiente para cada columna.
Cómo convertir JSON a CSV en JavaScript
No existe un JSON.toCSV incorporado, pero la conversión es breve. El único trabajo real es el escape: cualquier valor que contenga una coma, una comilla doble o un salto de línea debe ir entre comillas dobles, y las comillas internas se duplican.
function jsonToCsv(rows) {
if (!rows.length) return '';
const headers = [...new Set(rows.flatMap(Object.keys))];
const escape = (v) => {
if (v == null) return '';
const s = typeof v === 'object' ? JSON.stringify(v) : String(v);
return /[",\n\r]/.test(s) ? '"' + s.replace(/"/g, '""') + '"' : s;
};
const lines = [headers.join(',')];
for (const row of rows) {
lines.push(headers.map((h) => escape(row[h])).join(','));
}
return lines.join('\n');
} Fíjate en la rama typeof v === 'object': un objeto o array anidado no tiene una representación CSV plana, así que la convención habitual es serializarlo a texto JSON dentro de la celda. Más abajo se detalla.
Cómo convertir CSV a JSON en JavaScript
El problema en sentido inverso es parsear CSV correctamente —— los campos pueden contener comas y saltos de línea dentro de comillas, así que no basta con split(','). Usa una pequeña máquina de estados (o una librería como papaparse en producción):
function csvToJson(text) {
const rows = [];
let row = [], field = '', inQuotes = false;
for (let i = 0; i < text.length; i++) {
const c = text[i];
if (inQuotes) {
if (c === '"' && text[i + 1] === '"') { field += '"'; i++; }
else if (c === '"') inQuotes = false;
else field += c;
} else if (c === '"') inQuotes = true;
else if (c === ',') { row.push(field); field = ''; }
else if (c === '\n') { row.push(field); rows.push(row); row = []; field = ''; }
else if (c !== '\r') field += c;
}
if (field || row.length) { row.push(field); rows.push(row); }
const [headers, ...data] = rows;
return data.map((cells) =>
Object.fromEntries(headers.map((h, i) => [h, cells[i] ?? ''])));
}Cómo convertir JSON y CSV en Python
La librería estándar de Python ya lo trae —— sin dependencias.
import csv, json, io
# JSON -> CSV
rows = json.loads(json_text)
buf = io.StringIO()
writer = csv.DictWriter(buf, fieldnames=list(rows[0].keys()))
writer.writeheader()
writer.writerows(rows)
csv_text = buf.getvalue()
# CSV -> JSON
rows = list(csv.DictReader(io.StringIO(csv_text)))
json_text = json.dumps(rows, indent=2)Los casos límite que realmente importan
Objetos y arrays anidados
CSV es plano; JSON no. Cuando el valor es un objeto o array tienes dos opciones: serializarlo a JSON dentro de una celda (simple, reversible) o aplanarlo en varias columnas como address.city, address.zip (legible, pero con pérdida y difícil de revertir). Para ida y vuelta, el JSON en celda es más seguro.
CSV pierde los tipos
CSV no tiene tipos —— cada campo es texto. Al pasar de CSV a JSON, "1" es una cadena salvo que la conviertas deliberadamente a número. Cuidado con valores como 007 (un código postal/ID que debe seguir siendo cadena) o enteros enormes que pierden precisión al convertirse en números. Convierte sólo cuando la ida y vuelta sea sin pérdida.
Comillas y delimitadores
Pon siempre entre comillas los campos con comas, comillas o saltos de línea. Algunas configuraciones regionales (común en Excel europeo) usan ; como delimitador —— si tu CSV se ve mal en alguna columna, revisa primero el delimitador.
Claves inconsistentes
Si tus objetos JSON no comparten todas las mismas claves, construye la cabecera con la unión de claves y deja las celdas faltantes en blanco —— no asumas que el primer objeto define todas las columnas.
Excel y el BOM UTF-8
Si tu CSV se va a abrir en Excel y contiene caracteres no ASCII, antepone un BOM UTF-8 (los bytes 0xEF 0xBB 0xBF). Excel lee UTF-8 sin BOM como la codificación heredada y destroza acentos/caracteres asiáticos. La mayoría de librerías CSV pueden emitir el BOM mediante una opción.
// JavaScript —— escribir un BOM para que Excel lea UTF-8 correctamente
const out = '\uFEFF' + jsonToCsv(rows);Delimitadores alternativos (CSV vs TSV vs ;)
"CSV" no siempre va separado por comas. Variantes comunes:
- TSV —— separado por tabuladores; más seguro cuando los valores suelen contener comas.
- Excel europeo emite
;como delimitador en regiones donde la coma es el separador decimal.
Si la salida parece amontonarse en una sola columna rara al abrirla, el archivo usa un delimitador distinto al que espera el lector. Estandariza uno (CSV con , + BOM para Excel transregional, o TSV para pipelines de ingeniería).
Para CSV del mundo real usa PapaParse
Para parsear en navegador/Node CSV que llega de usuarios, usa PapaParse —— gestiona la detección de delimitador, campos entrecomillados, valores multilínea, filas de cabecera y dynamicTyping para convertir números y booleanos. Los snippets a mano de arriba sirven para entradas confiables y simples; para escala, lo que se usa es PapaParse.
Convierte JSON a CSV en línea —— sin instalación
Para una conversión puntual, sáltate el código por completo. Pega tu JSON en el conversor JSON a CSV de fixjson y haz clic en To CSV, o pega CSV y haz clic en To JSON. Gestiona el escapado, la unión de claves y la coerción de tipos automáticamente, y se ejecuta completamente en tu navegador —— nada se sube, algo importante cuando los datos contienen registros de clientes o exportaciones internas.
Preguntas frecuentes
¿Cómo convierto JSON a CSV?
Toma un array JSON de objetos, construye una fila de cabecera con la unión de todas las claves, y escribe una fila por objeto —— entrecomillando cualquier valor con coma, comilla o salto de línea. Usa csv.DictWriter en Python, una pequeña función en JavaScript, o pégalo en el conversor en línea.
¿Cómo convierto CSV a JSON?
Parsea el CSV (respetando los campos entrecomillados), trata la primera fila como cabecera y mapea cada fila siguiente a un objeto con esas cabeceras como claves. Recuerda que todos los valores llegan como cadenas a menos que los conviertas.
¿Cómo se representan los objetos JSON anidados en CSV?
CSV no anida, así que un objeto o array anidado suele escribirse como texto JSON dentro de una sola celda, o aplanarse en columnas con puntos como address.city. El JSON en celda es la opción reversible.
¿Puedo convertir JSON a CSV en línea gratis?
Sí —— el conversor de fixjson hace ambas direcciones gratis, totalmente en tu navegador, sin cuenta ni subida.
Herramientas y guías relacionadas
- Conversor JSON a CSV —— convierte en ambos sentidos en tu navegador
- Cómo convertir CSV y XML a JSON —— la dirección inversa, más XML
- ¿Qué es JSON? —— los tipos de datos detrás de la conversión
- Validador JSON —— comprueba que tu JSON parsea antes de convertir