Json To Csv LogoJson To Csv

Convert JSON to CSV locally: convierte JSON a CSV en tu propio equipo, sin subir el archivo (Guía 2026)

Convertir JSON a CSV localmente significa que la conversión se ejecuta en tu propio equipo y el archivo nunca tiene que salir de él. Eso puede significar una página conversora que se ejecuta por completo en tu pestaña del navegador, un script de Python, un comando de jq de una línea o un pequeño script de Node. Esta guía prueba cada método con archivos reales, explica cuándo lo local es la decisión correcta y cuándo no lo es, y muestra cómo comprobar el resultado antes de confiar en él.

Actualizado: 2026-10-2510 min de lectura

¿Qué significa realmente convertir JSON a CSV localmente?

La palabra local se usa para tres cosas distintas, y la diferencia importa cuando la privacidad es el motivo de la pregunta. El primer significado es del lado del cliente: una página web que hace la conversión dentro de tu pestaña del navegador. Sigues mirando un sitio web, pero la página nunca envía tus datos a ningún sitio, porque el código de conversión se ejecuta en tu equipo. El segundo significado es software instalado: un programa en tu ordenador, como una aplicación de escritorio o una extensión de editor, que lee un archivo y escribe un archivo. El tercer significado es un script que ejecutas tú: unas pocas líneas de Python, jq o Node que controlas por completo y que puedes leer antes de ejecutar.

Los tres mantienen el archivo en tu equipo. Se diferencian en lo que tienes que instalar, lo que tienes que aprender y lo repetible que es el resultado. Una página del lado del cliente no necesita nada instalado ni nada aprendido, pero repites los clics cada vez. Un script necesita una herramienta instalada y unas pocas líneas escritas, pero puedes ejecutarlo sobre cien archivos con un solo comando y obtener el mismo resultado cada vez. El resto de esta guía trata los tres como locales, y dice cuál es cada método.

Hay algo que local no significa: privado por arte de magia. Un script descargado de un desconocido y ejecutado sin leerlo puede hacer cualquier cosa en tu equipo, incluido enviar tu archivo a otro sitio. Los scripts de esta guía son lo bastante cortos para leerlos por completo, y deberías leer cualquier script antes de ejecutarlo con datos sensibles. Local es una propiedad del lugar donde ocurre el trabajo, y la verificas leyendo el código o observando la red, no confiando en una etiqueta.

Un buen hábito es distinguir entre el lugar de ejecución y el lugar de origen. Un archivo puede venir de una API, de un correo o de un compañero, y aun así convertirse localmente, porque el origen no cambia dónde se hace la conversión. Lo que importa es el camino que recorren los datos durante la conversión: si el camino se queda en tu equipo, el método es local; si el camino pasa por un servidor ajeno, no lo es, aunque la página parezca sencilla.

Cuándo conviene hacerlo en local y cuándo no

La conversión local es la decisión correcta en cuatro situaciones. La primera es datos sensibles: listas de clientes, registros internos, cualquier cosa bajo un contrato o una norma de privacidad que diga que los datos se quedan dentro de la empresa. Si el archivo no puede salir del equipo, un conversor de servidor simplemente no es una opción, por cómodo que sea. La segunda es no tener conexión: un avión, un lugar remoto, una red que bloquea la herramienta que querías. Las herramientas locales funcionan exactamente igual sin conexión, porque no hay ningún servidor al que llegar.

La tercera es la repetibilidad. Si conviertes el mismo tipo de exportación cada semana, un script convierte una sesión de quince minutos de clics en un solo comando, y el mismo comando da las mismas columnas en el mismo orden cada vez. La cuarta es el tamaño y el control: un archivo con millones de filas, o un archivo cuyas columnas necesitas renombrar y reordenar, es más fácil de manejar con un script que puedes ajustar que con una página cuyas opciones son fijas.

Lo local es la decisión incorrecta en tres situaciones. Si varias personas necesitan la misma conversión y los mismos ajustes, una página compartida supera a cinco copias de un script que se desvían entre sí. Si no tienes ningún equipo que controles, por ejemplo un ordenador prestado o un portátil de trabajo bloqueado que no puede instalar Python ni jq, una página del lado del cliente sigue siendo local y sigue siendo la mejor opción. Y si el archivo es más grande de lo que tu equipo puede mantener cómodamente en memoria, ningún método local ayuda hasta que dividas el archivo o lo proceses en flujo continuo, que es un trabajo distinto. Hazte una pregunta antes de elegir: ¿tiene que quedarse este archivo en este equipo, y voy a hacer esto de nuevo? Si ambas respuestas son sí, hazlo en local y escríbelo como script. Si solo la primera es sí, una página del lado del cliente basta.

También conviene pensar en quién va a repetir el trabajo dentro de seis meses. Un script documentado con dos líneas de comentario sobrevive a un cambio de equipo y a un cambio de persona, mientras que una secuencia de clics recordada de memoria se pierde en cuanto cambia la interfaz. Si el trabajo va a repetirse, documenta el comando junto al archivo, con el nombre de entrada y de salida, para que la próxima vez no tengas que adivinar nada.

Método 1: el conversor de esta página ya es local

El método local más sencillo ya está delante de ti. El conversor de esta página se ejecuta por completo dentro de tu pestaña del navegador. Cuando pegas JSON o subes un archivo, la página lo analiza, lo aplana y construye el texto CSV en tu 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.

Puedes verificar esa afirmación tú mismo en unos treinta segundos, y deberías hacerlo, porque una afirmación sobre privacidad merece comprobarse. 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. 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ú. Si pegas o subes en lugar de obtener desde una URL, la red nunca se usa.

Eso hace que la página sea el método local correcto para conversiones únicas y para equipos donde no puedes instalar nada. Los límites son los mismos que los de cualquier página: repites los clics para cada archivo, y los archivos muy grandes ralentizarán la pestaña. Para un solo archivo, o para un archivo que solo conviertes una vez, esos límites no importan. Para una exportación semanal, pasa a un script de los de abajo y conserva la página como comprobación rápida.

La página también sirve como referencia para los scripts. Si un script produce columnas distintas de las que produce la página con el mismo archivo, compara los ajustes de aplanado y de delimitador antes de culpar a los datos. Muchas discrepancias aparentes son solo un interruptor de aplanado en una posición distinta, o un delimitador distinto, y la página te permite ver el resultado esperado en segundos.

Método 2: Python, el caballo de batalla local, sin paquetes

Python es el método 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.

Python, standard library only
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 archivo de ejemplo usado en toda esta guía, tres pedidos con campos id, customer y tags, este script produjo una fila de encabezado más tres filas de datos. El objeto de cliente anidado salió como una cadena de representación de Python, no como texto JSON, y la lista de etiquetas salió como una lista de representación, porque un DictWriter simple no aplana los valores anidados. Ese es el límite honesto de la versión corta: los datos planos se convierten a la perfección, los datos anidados necesitan un paso más. El paso de aplanado es pequeño. 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, te da las mismas columnas que produce la página conversora con su interruptor de aplanado activado.

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.

Si trabajas con fechas, recuerda que el CSV no guarda tipos: una fecha sale como el texto que Python escriba, así que normaliza el formato antes de convertir si la hoja de cálculo receptora espera un formato concreto. Lo mismo vale para los números con decimales: decide si quieres punto o coma decimal antes de generar el archivo, porque cambiarlo después en la hoja de cálculo es más propenso a errores que dejarlo bien desde el script.

Método 3: jq, el comando de una línea para quienes viven en la terminal

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 la sección de Python falla en él con un error en lugar de una tabla incorrecta, que es el tipo de fallo seguro.

jq one-liner, flat objects
jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[] | @csv' orders-flat.json > orders.csv

Probado 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. El límite de datos anidados se confirmó en el equipo de pruebas: el mismo filtro sobre el ejemplo anidado falla con un error en lugar de una tabla incorrecta, que es el tipo de fallo seguro.

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.

Otra ventaja de jq es que te deja inspeccionar la forma de los datos antes de convertir. Un vistazo rápido a las claves del primer objeto, o un conteo de elementos de la lista, te dice si el archivo es plano o anidado antes de elegir el comando. Ese vistazo de cinco segundos evita la mayoría de los errores de columna, porque eliges el comando correcto para la forma real, no para la forma que suponías.

Método 4: Node, para cuando la conversión vive dentro de un proyecto

Node es el método local correcto 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.

Node script with dot-flattening
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,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, esas son añadidos a este script, no sustitutos de él.

En un proyecto, guarda el script junto a los datos o en la carpeta de herramientas del repositorio, y anota el comando exacto en el archivo README del proyecto. Un script que solo vive en el historial de la terminal se pierde; un script guardado con su comando se convierte en parte del proyecto y cualquier compañero puede repetir la conversión sin preguntarte nada.

Método 5: herramientas que ya tienes, VS Code y Excel sin conexión

Dos métodos 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.

Estos métodos 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 los dos métodos supera a instalar algo nuevo. Para un archivo que conviertes cada semana, un script propio supera a ambos.

Un detalle práctico de Excel: Power Query recuerda los pasos de la consulta, así que si la exportación de la próxima semana tiene la misma forma, puedes actualizar la consulta en lugar de repetir todos los clics. Guarda el archivo de Excel junto a la exportación y anota la ruta del JSON de origen, para que la actualización encuentre el archivo nuevo sin búsquedas.

Cuando lo local no basta, y qué hacer entonces

La conversión local tiene tres límites reales, y nombrarlos te evita forzar un método local donde no encaja. El primero es la colaboración: si cinco personas necesitan la misma conversión con los mismos ajustes, cinco scripts se desvían entre sí y una página compartida se mantiene coherente. El segundo es el acceso al equipo: en un ordenador prestado o bloqueado puede que no puedas instalar Python, jq ni Node, y entonces la página del lado del cliente sigue siendo tu método local. El tercero es la escala: un archivo más grande que la memoria forzará cada método de aquí, y la solución es dividir el archivo o procesarlo fila a fila, no un conversor distinto.

También hay un límite que la gente olvida: la conversión local no arregla datos malos. Un script convierte exactamente lo que contiene el archivo, incluidos campos faltantes, tipos mezclados y formas inconsistentes. Si la misma exportación a veces tiene un campo y a veces no, cada método de esta guía te da la unión de columnas con blancos, lo que es honesto pero puede no ser lo que tu hoja de cálculo espera. Arregla la exportación de origen cuando puedas, y documenta los blancos cuando no puedas.

Si el límite es la colaboración, una solución intermedia es publicar el script en un repositorio compartido con un ejemplo de entrada y de salida. Así todos usan la misma versión, y los cambios quedan registrados. Si el límite es la escala, divide el archivo por lotes con la misma forma y convierte cada lote por separado; luego une los CSV resultantes cuidando de no duplicar la fila de encabezado.

Higiene de archivos locales: cuatro comprobaciones antes de confiar en el CSV

Una conversión local solo está terminada cuando la salida pasa las comprobaciones, y las comprobaciones llevan menos de un minuto. Primero, conserva el JSON original. Nunca conviertas en el lugar sobrescribiendo la fuente, porque una conversión pierde información: los tipos se convierten en texto, la estructura anidada se convierte en nombres de columna, y no hay forma de volver al árbol original solo desde el CSV. Segundo, nombra la salida para que ordene bien: orders-2026-10-25.csv supera a output-final-v2.csv, y la fecha te dice de qué exportación vino.

Tercero, cuenta 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. Cuarto, abre el CSV con el delimitador correcto. Un archivo que se abre como una sola columna casi nunca son datos rotos; es un desajuste de delimitador entre el archivo y la hoja de cálculo, y volver a importar con el delimitador correspondiente lo arregla. La página conversora, el módulo csv de Python, jq y el script de Node de arriba entrecomillan según el delimitador activo, así que una apertura en una sola columna es un problema de apertura, no un problema de conversión.

Añade una quinta comprobación si el archivo va a otra persona: abre el CSV en una hoja de cálculo limpia y recorre las primeras y las últimas filas a ojo. Los errores de aplanado y de delimitador suelen verse en los extremos, en la primera fila de datos y en la última, antes que en el medio. Si los extremos están bien y el conteo de filas cuadra, el medio casi siempre está bien también.

Solución de problemas en conversiones locales

Los mismos cuatro problemas aparecen en cada método local, y cada uno tiene una solución. 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 arregla la fuente, porque ningún conversor debería adivinar con entradas rotas. Una apertura en una sola columna significa un desajuste de delimitador en el lado de apertura; vuelve a importar y elige el delimitador con el que se escribió el archivo.

Datos anidados que aparecen como texto JSON ilegible en las celdas significa que se omitió el aplanado: el script corto de Python y el comando de una línea de jq no aplanan, así que usa las variantes con aplanado de arriba o la página conversora con su interruptor de aplanado activado. Columnas en un orden distinto del del archivo significa 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 significa que el buscador de filas eligió una lista distinta de la que pretendías, lo que ocurre con respuestas de API envueltas; apunta la herramienta a la lista en sí, o desempaqueta primero la respuesta.

Si el error persiste después de esas comprobaciones, reduce el archivo a un solo registro y convierte ese registro solo. Con un registro, el problema se ve al instante: o el registro es plano y el comando era el incorrecto, o el registro es anidado y falta el aplanado, o el registro está roto y el analizador te dice dónde. Resolver el caso de un registro y luego volver al archivo completo es más rápido que adivinar sobre miles de filas.

Guías relacionadas

Preguntas frecuentes

¿Qué significa convertir JSON a CSV localmente?

Significa que la conversión se ejecuta en tu propio equipo en lugar de en un servidor. Eso puede ser una página conversora del lado del cliente que se ejecuta en tu pestaña del navegador, software instalado como VS Code o Excel, o un script que ejecutas tú en Python, jq o Node. En los tres casos el archivo nunca tiene que salir de tu ordenador.

¿El conversor de esta página es local?

Sí. Pega o sube JSON y la conversión se ejecuta dentro de tu pestaña del navegador, con el resultado entregado como un archivo descargado. Puedes verificarlo desconectándote de la red y convirtiendo igualmente: sigue funcionando. El único botón que usa la red es el botón opcional de obtener desde una URL, que carga JSON desde una dirección que escribes tú.

¿Necesito instalar algo para convertir JSON a CSV localmente?

No, si usas la página conversora, que no necesita nada instalado. Si quieres un script repetible, Python 3 ya está instalado en la mayoría de los equipos de desarrollo y su biblioteca estándar por sí sola basta. jq y Node son una instalación cada uno y ambos funcionan por completo sin conexión una vez instalados.

¿Qué método local es mejor para datos sensibles?

Cualquier método donde puedas ver el código está bien, pero un script corto que lees tú 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 una página del lado del cliente o un script sobre cualquier herramienta que suba el archivo.

¿Puedo convertir JSON a CSV localmente sin internet?

Sí. La página conversora funciona sin conexión una vez cargada, y Python, jq, Node, VS Code y Excel funcionan todos por completo sin conexión. El único paso que necesita conexión es obtener JSON desde una URL, que es opcional y está separado de la conversión en sí.

¿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ó al escribirlo. Vuelve a importar el archivo y elige el delimitador correspondiente, o genera de nuevo el CSV con punto y coma o tabulación, y las columnas aparecerán.

¿Convertir localmente 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 texto JSON. No hay forma de volver al árbol original solo desde el CSV, así que conserva siempre el archivo JSON original.

Prueba el método local ahora mismo

Pega cualquier JSON en el conversor de esta página y mira cómo se convierte dentro de tu pestaña del navegador, sin subida, sin registro, nada sale de tu equipo. O copia el script de Python y ejecútalo con tus propios archivos.

Abrir el conversor de JSON a CSV
Todas las guías