Las seis formas de un vistazo
Antes de los detalles, aquí está todo el panorama en una sola pasada, porque la forma más rápida de elegir es descartar cinco opciones. Forma 1, la página conversora del lado del cliente, no necesita nada instalado y mantiene el archivo en tu equipo, pero repites los clics para cada archivo. Forma 2, Python solo con la biblioteca estándar, necesita Python 3 y nada más, maneja datos planos a la perfección y deja los valores anidados como texto de representación de Python. Forma 3, Python con pandas, aplana los objetos anidados en columnas con notación de puntos de forma automática, pero necesita pandas instalado y aun así requiere una corrección de una línea para las listas. Forma 4, jq, es una sola línea de terminal para datos planos y falla de forma ruidosa, en lugar de hacerlo mal, con datos anidados. Forma 5, un script de Node, aplana los objetos anidados y une las listas con una función auxiliar que puedes leer completa, y encaja de forma natural en un proyecto. Forma 6, VS Code o Excel, no necesita ninguna instalación nueva si ya usas la herramienta, y cambia control por comodidad.
Dos preguntas descartan la mayor parte de la lista antes de que sigas leyendo. Primera, ¿tus datos son planos o anidados? Los datos planos, un nivel de claves por objeto, funcionan con las seis formas. Los datos anidados, objetos dentro de objetos o listas dentro de objetos, descartan el comando simple de jq y el script simple de Python con la biblioteca estándar a menos que añadas aplanado. Segunda, ¿vas a hacer esto de nuevo? Una conversión única favorece la página o la herramienta que ya tienes. Una exportación semanal favorece un script, porque el mismo comando da las mismas columnas en el mismo orden cada vez. Ten presentes esas dos preguntas y el resto de la guía se convierte en una tabla de consulta.
Cada afirmación de esta guía se probó con el mismo ejemplo antes de publicarse: tres pedidos, cada uno con un id, un objeto de cliente anidado con nombre y ciudad, una lista de etiquetas y un total. Se usaron variantes planas del mismo archivo donde un método solo maneja datos planos. Cuando un método falla con datos anidados, esta guía lo dice y muestra el fallo exacto en lugar de disimularlo, porque un fallo que puedes ver es más seguro que una tabla incorrecta que no puedes ver.
Forma 1: la página conversora del lado del cliente
La forma local más sencilla es el conversor de esta página, y cuenta como local aunque viva en un sitio web. Cuando pegas JSON o subes un archivo, la página lo analiza, lo aplana y construye el texto CSV dentro de tu pestaña del navegador, y luego te entrega el resultado como un archivo descargado. No hay ningún paso de subida ni ningún servidor esperando tus datos, porque el código de conversión viene con la página y se ejecuta en tu equipo. El único botón de la página que toca la red es el botón opcional de obtener desde una URL, que carga JSON desde una dirección web que escribes tú. Pega o sube en lugar de obtener desde una URL, y la red nunca se usa.
Puedes verificar esa afirmación tú mismo en unos treinta segundos. Abre el conversor, desconéctate de la red o activa el modo avión, y luego pega JSON y conviértelo. Sigue funcionando, porque nada de la conversión necesita la red. Esa prueba merece hacerse una vez, porque una afirmación sobre privacidad merece comprobarse en lugar de creerse, y esta la supera.
La página es la forma correcta para un archivo único, para un equipo donde no puedes instalar nada y para un archivo que quieres convertir antes de comprometerte con un script. Sus límites son los mismos que los de cualquier página: repites los clics para cada archivo, y un archivo muy grande ralentizará la pestaña. También decide algunas cosas por ti, como el orden de las columnas y el comportamiento de aplanado, a través de sus opciones en lugar de hacerlo mediante código que controles. Para un solo archivo esos límites no importan. Para una exportación semanal, elige un script de los de abajo y conserva la página como tu comprobación rápida.
Forma 2: Python solo con la biblioteca estándar
Python es la forma local más útil para la mayoría de la gente, porque ya está instalado en la mayoría de los equipos de desarrollo y la biblioteca estándar por sí sola basta. Nada de pandas, nada de paquetes, nada que descargar. El script de abajo lee un archivo JSON de objetos, toma los nombres de columna del primer objeto y escribe un CSV con el módulo csv estándar, que gestiona el entrecomillado correctamente por sí mismo. Guárdalo como json2csv.py y ejecútalo con python3 json2csv.py orders.json orders.csv.
import json, csv, sys
with open(sys.argv[1]) as f:
rows = json.load(f)
with open(sys.argv[2], 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)Probado con el ejemplo de tres pedidos, este script produjo una fila de encabezado más tres filas de datos, y el resultado muestra su único límite honesto a plena vista. El objeto de cliente anidado salió como una cadena de representación de Python, como {'name': 'Ana', 'city': 'Lima'}, y la lista de etiquetas salió como una lista de representación, como ['new', 'vip']. Un DictWriter simple no aplana los valores anidados, así que los datos planos se convierten a la perfección y los datos anidados se convierten de forma visiblemente incorrecta, lo que al menos es fácil de detectar. La corrección es una función recursiva corta que convierte los objetos anidados en claves con notación de puntos, customer.name y customer.city, antes de escribir, y eso es exactamente lo que hace el script de Node de la forma 5.
El módulo csv está haciendo trabajo real por ti aquí. Entrecomilla las celdas que contienen el delimitador, duplica las comillas interiores y escribe los finales de línea que tu hoja de cálculo espera. No construyas CSV uniendo valores con comas por tu cuenta. Unir a mano se rompe con la primera coma dentro de un valor, y esa rotura es silenciosa: el archivo parece correcto hasta que una columna se desplaza. La versión de biblioteca estándar también se ejecuta igual en cada equipo con Python 3, y por eso es el método al que recurrir cuando un colega necesita ejecutar tu conversión también.
Forma 3: Python con pandas json_normalize
Si la forma 2 es el mínimo honesto, la forma 3 es la mejora que la mayoría de la gente realmente quiere. La función json_normalize de pandas toma los objetos anidados y los convierte en columnas con notación de puntos de forma automática, así que customer se convierte en customer.name y customer.city sin ninguna función auxiliar que escribas tú. El script de abajo lee el mismo archivo de pedidos, lo normaliza y escribe un CSV. Necesita pandas instalado, que es una sola instalación, y luego todo el trabajo son tres líneas.
import json, pandas as pd
with open('orders.json') as f:
rows = json.load(f)
df = pd.json_normalize(rows)
df.to_csv('orders.csv', index=False)Probado con el mismo ejemplo de tres pedidos, json_normalize produjo las columnas id, tags, total, customer.name y customer.city, con tres filas. Ese es el comportamiento que debes esperar: los objetos anidados se aplanan, los campos planos pasan tal cual y las columnas anidadas aplanadas quedan después de las planas. Las listas son el detalle que queda. La lista de etiquetas salió como texto de representación de Python, igual que en la forma 2, porque json_normalize no adivina qué significa una lista. La corrección de una línea es unir las listas cortas antes de escribir, por ejemplo df['tags'] = df['tags'].apply(lambda v: '; '.join(v) if isinstance(v, list) else v), que convierte la lista en una celda legible. Para una lista en la que cada elemento debería convertirse en su propia fila, esa es una operación distinta, explotar la lista, y pandas tiene un paso explode separado para ello. La regla es sencilla: el aplanado maneja objetos, la unión maneja listas cortas y la explosión maneja listas que significan filas.
Pandas es la forma correcta cuando tus datos son anidados, cuando vas a limpiarlos o filtrarlos antes de escribir y cuando ya trabajas en Python. Es la forma incorrecta cuando instalar un paquete no es posible, o cuando el trabajo es un solo archivo plano que jq o la página terminarían más rápido. La instalación es el único coste real, y se amortiza la segunda vez que conviertes.
Forma 4: jq, el comando de una línea para datos planos
Si ya usas la terminal, jq convierte todo el trabajo en una línea, para datos planos. Lee JSON, toma las claves del primer objeto como encabezado y luego emite cada fila como una línea CSV, con el entrecomillado gestionado por su formateador @csv. Nada de archivo de script, nada de bucle, nada de entrecomillado manual. El comando de abajo lee un archivo plano de pedidos, id, city y total por pedido, y escribe orders.csv. Ten en cuenta el límite, dicho con claridad: el formateador @csv rechaza los objetos y las listas anidadas, así que este comando de una línea es solo para exportaciones planas, y el ejemplo anidado de las secciones anteriores falla en él con un error en lugar de una tabla incorrecta, que es el tipo de fallo seguro.
jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[] | @csv' orders-flat.json > orders.csvProbado con un archivo plano de tres pedidos, la salida fue una fila de encabezado entrecomillada, "id","city","total", seguida de tres filas de datos con las celdas de texto entrecomilladas y los números sin comillas, exactamente la forma que produce @csv. El detalle de keys_unsorted importa: keys sin más ordenaría las columnas alfabéticamente, lo que cambia el orden de columnas respecto a tu archivo. Si tus datos tienen objetos anidados, jq necesita primero un filtro de aplanado, y el comando de una línea crece hasta convertirse en un pequeño script. Para exportaciones planas, que es lo que la mayoría de las respuestas de lista de API ya son una vez desempaquetadas, el comando de una línea es todo el trabajo, y se ejecuta sin conexión en cualquier equipo con jq instalado.
Una precaución: jq lee todo el archivo en memoria, así que una exportación de varios gigabytes lo forzará igual que fuerza una pestaña del navegador. Para exportaciones normales, hasta decenas de megabytes, es instantáneo. Para archivos muy grandes, divide primero el archivo o usa una herramienta de flujo continuo, y trata eso como un problema separado de la conversión.
Forma 5: Node, para cuando la conversión vive dentro de un proyecto
Node es la forma local correcta cuando la conversión forma parte de un proyecto en lugar de una tarea única: un paso de construcción, un flujo de datos, un script que el equipo ya ejecuta. Node trae el análisis de JSON incorporado, así que el único trabajo es convertir las filas en texto CSV, y el pequeño script de abajo lo hace con una función auxiliar de aplanado por puntos, de modo que los objetos anidados se convierten en columnas con notación de puntos, igual que el comportamiento de la página conversora. Guárdalo como json2csv.mjs y ejecútalo con node json2csv.mjs orders.json orders.csv.
import { readFileSync, writeFileSync } from 'node:fs';
const flatten = (obj, prefix = '', out = {}) => {
for (const [k, v] of Object.entries(obj)) {
const key = prefix ? prefix + '.' + k : k;
if (v && typeof v === 'object' && !Array.isArray(v)) flatten(v, key, out);
else out[key] = Array.isArray(v) ? v.join('; ') : v;
}
return out;
};
const rows = JSON.parse(readFileSync(process.argv[2], 'utf8')).map(r => flatten(r));
const cols = [...new Set(rows.flatMap(r => Object.keys(r)))];
const esc = v => v == null ? '' : /[",\n]/.test(String(v)) ? '"' + String(v).replaceAll('"', '""') + '"' : String(v);
const lines = [cols.join(','), ...rows.map(r => cols.map(c => esc(r[c])).join(','))];
writeFileSync(process.argv[3], lines.join('\n'));Probado con el mismo ejemplo, el script produjo el encabezado id,customer.name,customer.city,tags,total y tres filas, con el objeto de cliente anidado aplanado en dos columnas y la lista de etiquetas unida con punto y coma y un espacio. La función de escape sigue la misma regla que usa la página conversora: entrecomillar una celda solo cuando contiene el delimitador, una comilla o un salto de línea, y duplicar cualquier comilla interior. Esa regla es todo el entrecomillado de CSV, y acertar con ella es la diferencia entre un archivo que se abre limpio y un archivo que desplaza columnas en silencio.
El script es deliberadamente corto para que puedas leerlo antes de ejecutarlo. Toma la unión de todas las columnas de todas las filas, así que una fila a la que le falta un campo obtiene una celda vacía, lo que coincide con la página conversora. Si necesitas flujo continuo para archivos enormes, o renombrado de columnas, esos son añadidos a este script, no sustitutos de él.
Forma 6: las herramientas que ya tienes, VS Code y Excel
Dos formas locales más no necesitan ninguna instalación nueva si ya usas las herramientas. En VS Code, una extensión convierte el archivo JSON abierto a CSV desde la paleta de comandos, que es el camino local más rápido cuando ya estás editando el archivo. El recorrido completo, incluida qué extensión y los comandos exactos, está en la guía de VS Code enlazada abajo. En Excel, Power Query lee un archivo JSON desde tu disco y lo convierte en una tabla sin que el archivo salga nunca del equipo: Datos, Obtener datos, Desde archivo, Desde JSON, y luego expandir las columnas y cargar. Ambos funcionan por completo sin conexión una vez instalada la herramienta, y ambos mantienen el archivo en tu equipo en todo momento.
Estas formas cambian control por comodidad. VS Code y Excel deciden el manejo de columnas por ti, y sus valores por defecto suelen ser correctos para datos planos y a veces sorprendentes para datos anidados. Si la salida parece incorrecta, el diagnóstico es el mismo que en todas partes: comprueba si los valores anidados se aplanaron o se dejaron como texto JSON, y comprueba el delimitador al abrir. Para un archivo que conviertes una vez, cualquiera de las dos formas supera a instalar algo nuevo. Para un archivo que conviertes cada semana, un script propio supera a ambas, porque el script no depende de una versión de extensión ni de un diálogo por el que debes pasar de nuevo.
Hay una nota honesta más sobre la forma 6. Excel y VS Code son locales, pero no son mínimos: son programas grandes con sus propios ajustes, y un ajuste puede cambiar el resultado, por ejemplo una configuración regional que espera punto y coma en lugar de comas. Si la salida difiere entre dos equipos, revisa los ajustes de la herramienta antes de culpar a los datos. Los scripts no tienen este problema, porque el script es el ajuste.
Lado a lado: qué forma para cada situación
Con las seis formas probadas, la elección se convierte en una lista de decisión corta. Archivo único, nada que instalar, la privacidad importa: la página conversora. Archivo plano, vives en la terminal, quieres un solo comando: jq. Archivo plano o anidado, ya usas Python, puede que repitas el trabajo: Python con pandas. No se permiten paquetes, o un colega debe ejecutarlo también: Python con la biblioteca estándar más una función auxiliar de aplanado para datos anidados. Conversión dentro de un proyecto o un paso de construcción: el script de Node. Ya estás editando el archivo, o ya estás en una hoja de cálculo: VS Code o Excel.
Dos situaciones merecen una respuesta directa porque surgen constantemente. Datos sensibles, donde el archivo debe quedarse en el equipo: cualquier forma de esta página sirve, pero un script corto que leas tú mismo es la opción más sólida, porque no hay nada oculto en lo que confiar. Lee el script antes de ejecutarlo con datos sensibles, conserva el JSON original y prefiere la página o un script antes que cualquier herramienta que suba el archivo. Exportaciones semanales, donde la misma forma llega una y otra vez: un script, Python con pandas o Node, porque el mismo comando da las mismas columnas cada vez, y el script se puede programar.
Y dos situaciones en las que ninguna forma de esta página es la respuesta correcta. Varias personas necesitan la misma conversión con los mismos ajustes: una página compartida supera a cinco copias de un script que se desvían entre sí. Un archivo más grande que la memoria: todas las formas de aquí se esfuerzan, y la solución es dividir el archivo o procesarlo fila a fila, que es un trabajo distinto de la conversión. Nombrar esos límites forma parte de la comparación, no es un hueco en ella.
Qué pierde cada forma, y por qué debes conservar el original
Todas las formas de esta página pierden la misma información, porque la pérdida está en el cambio de formato, no en la herramienta. Los tipos se convierten en texto: un número, un valor verdadero o falso y un nulo se convierten en caracteres dentro de una celda, y una hoja de cálculo puede reinterpretarlos al abrir. Los objetos anidados se convierten en columnas con notación de puntos o en celdas unidas, y las listas se convierten en texto unido o en filas extra, según la forma que elijas. No hay forma de volver al árbol original solo desde el CSV, porque el CSV no registra qué columnas eran anidadas, qué celdas eran listas ni qué valores eran números.
Por eso la primera regla de la conversión local es conservar el JSON original. Nunca conviertas en el lugar sobrescribiendo la fuente. Nombra la salida para que ordene bien, por ejemplo orders-2026-10-26.csv, y conserva el JSON junto a ella. Si el CSV sale mal, lo regeneras desde el JSON en lugar de depurar un archivo que ya ha perdido información. Esta regla no cuesta nada y evita el único fallo que no puedes deshacer.
La segunda regla es contar las filas. El CSV debería tener una fila de encabezado más una fila por objeto del JSON, y un conteo rápido detecta el fallo más común, que es un buscador de filas que elige la lista incorrecta de una respuesta envuelta. Si los conteos no coinciden, apunta la herramienta a la lista en sí, o desempaqueta primero la respuesta, antes de confiar en ninguna fila.
Solución de problemas en las seis formas
Los mismos cuatro problemas aparecen en todas las formas, y cada uno tiene una solución. Una apertura en una sola columna significa un desajuste de delimitador en el lado de apertura, no datos rotos: vuelve a importar y elige el delimitador con el que se escribió el archivo. Datos anidados que aparecen como texto de representación o JSON ilegible en las celdas significan que se omitió el aplanado: el script simple de Python y el comando de una línea de jq no aplanan, así que usa la versión de pandas, el script de Node o la página con su interruptor de aplanado activado.
Columnas en un orden distinto del del archivo significan que una herramienta ordenó las claves: jq necesita keys_unsorted, y el script de Node conserva el orden de primera aparición. Filas que faltan por completo significan que el buscador de filas eligió una lista distinta de la que pretendías, lo que ocurre con respuestas de API envueltas: la página conversora tiene un paso de detección de filas, y un script necesita que se le pase la lista de forma explícita. Archivo no encontrado significa que la terminal está en una carpeta distinta de la del archivo; comprueba la ruta antes que nada. JSON inválido significa que el archivo de origen está roto cerca de la posición indicada, normalmente una comilla faltante o una coma final; valídalo y corrige la fuente, porque ningún conversor debería adivinar con entradas rotas.
Guías relacionadas
- Convert JSON to CSV locally: convierte JSON a CSV en tu propio equipo, sin subir el archivo (Guía 2026)
- json to csv converter download: qué deberías descargar de verdad (Guía 2026)
- Cómo aplanar JSON a CSV: qué hace realmente esa opción (Guía 2026)
- El archivo CSV se abre en una sola columna en Excel: por qué pasa y cómo corregirlo (Guía 2026)
- Por qué tu CSV muestra caracteres extraños en Excel y cómo corregir la codificación (Guía 2026)
- Por qué Excel elimina los ceros a la izquierda de tus códigos CSV y cómo conservarlos (Guía 2026)
- Por qué Excel cambia las fechas de tu CSV e intercambia el día y el mes, y cómo evitarlo (Guía 2026)
- Por qué guardar tu CSV en Excel lo cambia y cómo mantener el original a salvo (Guía 2026)
- Por qué tu CSV es demasiado grande para Excel y qué hacer en su lugar (Guía 2026)
Preguntas frecuentes
¿Cuáles son las formas de convertir JSON a CSV localmente?
Seis formas: una página conversora del lado del cliente que se ejecuta en tu pestaña del navegador, un script de Python que usa solo la biblioteca estándar, Python con pandas json_normalize, un comando de jq de una línea en la terminal, un pequeño script de Node con una función auxiliar de aplanado por puntos, y las herramientas que ya tienes, una extensión de VS Code o Excel Power Query. Las seis mantienen el archivo en tu propio equipo.
¿Qué forma local es mejor para un archivo único?
La página conversora. Pega o sube el JSON, conviértelo en la pestaña, descarga el CSV y no se instala nada. Puedes verificar que es local desconectándote de la red y convirtiendo igualmente: sigue funcionando, porque la conversión se ejecuta en tu navegador.
¿Qué forma local maneja mejor el JSON anidado?
Python con pandas json_normalize, el script de Node con una función auxiliar de aplanado por puntos, o la página conversora con su interruptor de aplanado activado. Las tres convierten los objetos anidados en columnas con notación de puntos como customer.name. El script simple de Python deja los valores anidados como texto de representación, y el comando simple de jq falla con datos anidados en lugar de producir una tabla incorrecta.
¿Necesito instalar algo para convertir JSON a CSV localmente?
No, si usas la página conversora o una herramienta que ya tienes, como VS Code o Excel. Python 3 ya está instalado en la mayoría de los equipos de desarrollo y su biblioteca estándar por sí sola maneja datos planos. Pandas, jq y Node son una instalación cada uno y todos funcionan por completo sin conexión una vez instalados.
¿Por qué mi CSV local se abre como una sola columna?
Eso es un desajuste de delimitador en el lado de apertura, no datos rotos. Tu hoja de cálculo dividió el archivo con un delimitador distinto del que se usó para escribirlo. Vuelve a importar el archivo y elige el delimitador correspondiente, y las columnas aparecerán.
¿Por qué los valores anidados aparecen como texto extraño en mi CSV?
Porque se omitió el aplanado. El script simple de Python con la biblioteca estándar escribe los objetos anidados como texto de representación de Python, y pandas deja las listas como texto de representación a menos que las unas. Usa pandas json_normalize para objetos más una unión para listas cortas, o el script de Node, o la página conversora con el aplanado activado.
¿Convertir en local pierde alguna información?
Sí, la misma información que pierde cualquier conversión. Los valores se conservan pero los tipos se convierten en texto, los objetos anidados se convierten en columnas con notación de puntos y las listas se convierten en celdas unidas o en filas extra. No hay forma de volver al árbol original solo desde el CSV, así que conserva siempre el archivo JSON original.
Elige tu forma y convierte ahora
Empieza con la forma local más rápida: pega cualquier JSON en el conversor de esta página y míralo convertirse dentro de tu pestaña del navegador, sin subidas, sin registro, sin que nada salga de tu equipo. O copia la versión de Python, jq o Node y ejecútala con tus propios archivos.
Abrir el conversor de JSON a CSV