CSV y JSON son probablemente los dos formatos de datos más comunes que encontrarás como desarrollador. Los archivos CSV aparecen en exportaciones de hojas de cálculo, volcados de bases de datos y pipelines de ciencia de datos. JSON está en todas partes en la web — APIs REST, archivos de configuración, bases de datos NoSQL. Ambos son texto plano, ambos son legibles por humanos, y ambos hacen el trabajo. Pero están diseñados para diferentes formas de datos, y elegir el incorrecto crea verdaderos dolores de cabeza. Este artículo recorre las diferencias fundamentales, te muestra ejemplos concretos de dónde cada formato brilla (y falla), y te da una guía de decisión práctica para elegir entre ellos.

La diferencia fundamental: Tablas vs Árboles

CSV — definido en RFC 4180 — es un formato plano y tabular. Cada fila tiene las mismas columnas, cada valor es una cadena. Eso es todo. Se mapea perfectamente a una hoja de cálculo o una tabla de base de datos: filas hacia abajo, columnas a lo ancho.

JSON — especificado en RFC 8259 y descrito en json.org — es un formato jerárquico. Los valores pueden ser objetos, arrays, cadenas, números, booleanos o null. Los objetos se anidan dentro de objetos, los arrays contienen formas mixtas. Se mapea a cómo los datos viven realmente en el código — registros con relaciones, listas de cosas diferentes, valores tipados.

Resumen en una línea: CSV es una tabla. JSON es un árbol. Si tus datos son una tabla, CSV es más simple y más pequeño. Si tus datos tienen algún anidamiento, CSV perderá información o te forzará en soluciones de trabajo dolorosas.

Los mismos datos en ambos formatos

Aquí es donde la diferencia se vuelve concreta. Imagina un catálogo de productos para una tienda de e-commerce. Los productos tienen un nombre, precio y si están en stock — sencillo. Pero también tienen variantes (tallas, colores) y atributos (material, peso). Veamos cómo se ven esos datos en ambos formatos.

En JSON, esto es natural:

json
[
  {
    "id": "SHOE-001",
    "name": "Trail Runner Pro",
    "price": 129.99,
    "inStock": true,
    "attributes": {
      "material": "mesh",
      "weightGrams": 280
    },
    "variants": [
      { "size": 9,  "color": "black", "sku": "TR-9-BLK",  "qty": 12 },
      { "size": 9,  "color": "white", "sku": "TR-9-WHT",  "qty": 4  },
      { "size": 10, "color": "black", "sku": "TR-10-BLK", "qty": 7  }
    ]
  },
  {
    "id": "SHOE-002",
    "name": "City Walker",
    "price": 89.99,
    "inStock": true,
    "attributes": {
      "material": "leather",
      "weightGrams": 340
    },
    "variants": [
      { "size": 8,  "color": "brown", "sku": "CW-8-BRN",  "qty": 6  },
      { "size": 9,  "color": "brown", "sku": "CW-9-BRN",  "qty": 15 }
    ]
  }
]

Ahora trata de poner eso en un CSV. Tienes dos opciones, ambas incómodas. Opción uno: aplanar todo y repetir datos del padre para cada fila de variante:

csv
product_id,product_name,price,inStock,material,weightGrams,variant_size,variant_color,sku,qty
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,9,black,TR-9-BLK,12
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,9,white,TR-9-WHT,4
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,10,black,TR-10-BLK,7
SHOE-002,City Walker,89.99,true,leather,340,8,brown,CW-8-BRN,6
SHOE-002,City Walker,89.99,true,leather,340,9,brown,CW-9-BRN,15

El nombre del producto, precio y atributos se repiten en cada variante. Eso es redundancia de datos — no es gran cosa para cinco filas, pero para un catálogo de 50,000 productos con 8 variantes cada uno, se acumula. Opción dos: serializar las variantes como una cadena JSON dentro de una columna CSV — pero ahora estás incrustando JSON dentro de CSV para sortear las limitaciones de CSV, lo cual es una señal de código incorrecto si alguna vez he visto una.

Dónde gana CSV

A pesar de esa limitación, CSV es genuinamente la mejor opción en varios escenarios comunes.

  • Hojas de cálculo y herramientas de BI. Excel, Google Sheets, Tableau, Looker, Power BI — todos abren CSV nativamente con un clic. Sin asistente de importación, sin esquema que definir, sin paso de transformación. Si tus partes interesadas viven en hojas de cálculo, CSV es el camino de menor resistencia.
  • Datos puramente planos. Si tus datos genuinamente son una tabla — eventos de análisis, registros de transacciones, lecturas de sensores, exportación de usuarios — CSV es más pequeño y más simple. Sin claves repetidas, sin corchetes, sin ruido.
  • Importación/exportación de bases de datos. Cada base de datos SQL tiene un comando COPY FROM CSV o equivalente. Es el formato de intercambio estándar para la carga masiva de datos y es órdenes de magnitud más rápido que las sentencias INSERT.
  • pandas y ciencia de datos. pandas.read_csv() es una de las funciones más usadas en el trabajo de datos de Python. Todo el ecosistema — NumPy, scikit-learn, Polars — trata CSV como formato de entrada de primera clase.
  • Tamaño de archivo para tablas planas grandes. Sin nombres de clave en cada fila, CSV es más pequeño para tablas anchas con muchas filas. Un CSV de un millón de filas de eventos de análisis superará cómodamente el array JSON equivalente.

Dónde gana JSON

  • Datos anidados y jerárquicos. Tan pronto como tus datos tienen alguna estructura más allá de una tabla plana — objetos anidados, arrays de diferentes formas, registros relacionados — JSON los maneja naturalmente. CSV no puede representar esto sin perder información o crear redundancia.
  • Preservación de tipos. En CSV, todo es una cadena. true, 42, null, y "true" se ven igual. Tienes que inferir tipos en el extremo receptor, lo que conduce a errores. JSON tiene booleanos, números y null nativos. inStock: true es inequívocamente un booleano — sin necesidad de adivinar.
  • APIs REST y la web. JSON es el formato de datos nativo de la web. Cada biblioteca cliente HTTP, cada API Fetch del navegador, cada API REST y GraphQL habla JSON. Enviar CSV a través de HTTP es posible pero inusual — necesitarías análisis personalizado en ambos extremos.
  • Bases de datos NoSQL. MongoDB, DynamoDB, Firestore, Elasticsearch, CouchDB — todos usan JSON (o un superconjunto binario como BSON) como su formato de documento nativo. Escribes JSON, obtienes JSON de vuelta.
  • Archivos de configuración. package.json, tsconfig.json, manifest.json — la configuración de herramientas se ha estandarizado en JSON porque soporta estructuras anidadas y es fácil de generar y validar programáticamente.
  • Validación de esquemas. JSON Schema te permite definir la forma exacta de un documento y validar datos contra él — verificaciones de tipo, campos requeridos, coincidencia de patrones, restricciones de array. CSV no tiene ningún estándar equivalente.

Tamaño de archivo: la historia real

La afirmación "CSV es más pequeño" es verdadera en un caso específico: tablas planas grandes con muchas filas. Toma 100,000 eventos de análisis, cada uno con ocho campos fijos. En CSV, los nombres de campo aparecen una vez en el encabezado. En JSON, aparecen en cada objeto. Esa repetición se acumula — el array JSON podría ser 30-50% más grande que el CSV equivalente.

Pero invierte el escenario a datos anidados y las matemáticas cambian. El CSV aplanado de nuestro catálogo de zapatos repite el nombre del producto, precio y atributos en cada fila de variante. La versión JSON almacena cada producto una vez. Para datos profundamente anidados con muchos campos padre repetidos, JSON puede en realidad ser más pequeño.

En la práctica, si el tamaño del archivo es una preocupación real, ambos formatos se comprimen extremadamente bien con gzip — los nombres de clave repetitivos en JSON y los valores de filas repetidos en CSV se comprimen fuertemente. Servir JSON comprimido con gzip a través de HTTP es una práctica estándar, y la diferencia de tamaño generalmente se vuelve insignificante después de la compresión.

Comparación de herramientas

La historia de las herramientas para cada formato refleja dónde se usa más.

Herramientas CSV: Excel, Google Sheets y LibreOffice Calc lo abren nativamente. La biblioteca pandas hace de CSV el formato predeterminado para el análisis de datos en Python. Cada base de datos relacional tiene un comando de importación/exportación CSV. Herramientas de línea de comandos como csvkit y xsv te permiten filtrar, unir y agregar archivos CSV sin escribir código. El tipo MIME es text/csv, registrado en IANA.

Herramientas JSON: Cada lenguaje de programación tiene un analizador JSON integrado o de biblioteca estándar. JSON.parse() en JavaScript, json.loads() en Python, encoding/json en Go, serde_json en Rust. La referencia JSON de MDN es una de las páginas más visitadas en MDN. En línea de comandos: jq es indispensable para consultar y transformar JSON. Los IDEs lo formatean y validan automáticamente.

Si estás trabajando con pipelines de datos que abarcan ambos mundos — cargando respuestas de API JSON en un almacén de datos, o exportando registros de base de datos para una hoja de cálculo — regularmente convertirás entre los dos. El convertidor CSV a JSON y el convertidor JSON a CSV manejan eso rápidamente. Para ordenar archivos sin procesar antes del procesamiento, el Formateador CSV y el Formateador JSON valen la pena marcar.

El híbrido: JSON Lines (NDJSON)

Hay una tercera opción que vale la pena conocer: JSON Lines, también llamado NDJSON (Newline-Delimited JSON). La idea es simple — un objeto JSON completo por línea, sin array circundante.

json
{"id":"SHOE-001","name":"Trail Runner Pro","price":129.99,"inStock":true,"variantCount":3}
{"id":"SHOE-002","name":"City Walker","price":89.99,"inStock":true,"variantCount":2}
{"id":"SHOE-003","name":"Summit Hiker","price":159.99,"inStock":false,"variantCount":5}

Este formato te da lo mejor de ambos mundos para ciertos casos de uso. Como CSV, puedes transmitirlo y procesarlo línea por línea sin cargar todo el archivo en memoria — crítico para archivos de registro grandes o salidas de pipeline de datos. Como JSON, cada línea puede tener un esquema diferente y preserva tipos. Puedes usar herramientas Unix estándar (grep, wc -l, head) para trabajar con él, pero también pasar cada línea a través de jq para consultas estructuradas.

NDJSON se usa ampliamente para la agregación de registros (es el formato de salida predeterminado para muchos registradores estructurados), etapas de pipeline de datos y exportaciones de datos de entrenamiento de ML. Si estás escribiendo un script que procesa millones de registros y cada registro es un objeto JSON, NDJSON generalmente es la elección correcta sobre un array JSON gigante — evitas cargar todo en memoria y puedes reanudar desde un punto de control fácilmente.

python
import json

# Process a large NDJSON file without loading it all into memory
with open('products.ndjson', 'r') as f:
    for line in f:
        product = json.loads(line.strip())
        if product['inStock'] and product['price'] < 100:
            print(f"{product['name']} — ${product['price']}")

Guía de decisión: CSV vs JSON

Aquí está la versión práctica. Cuando estés eligiendo entre los dos, hazte estas preguntas:

  • ¿Tus datos son genuinamente planos (sin anidamiento, sin arrays)? Si sí, CSV es más simple. Si no, JSON.
  • ¿Un no-desarrollador consumirá este archivo? ¿Analistas en Excel? ¿Usuarios de negocio en Google Sheets? Usa CSV.
  • ¿Estás sirviendo o consumiendo una API HTTP? Usa JSON. Punto.
  • ¿Estás haciendo una importación o exportación masiva de base de datos? Usa CSV — cada base de datos lo soporta nativamente.
  • ¿Los datos tienen tipos mixtos (booleanos, números, nulls)? Usa JSON para evitar errores de inferencia de tipos en el extremo receptor.
  • ¿El archivo se procesará fila por fila en un pipeline de streaming? Considera NDJSON como término medio.
  • ¿Estás almacenando configuración? Usa JSON (o YAML si los comentarios te importan).
  • ¿El esquema necesita variar por registro? JSON. CSV impone las mismas columnas en cada fila.
El valor predeterminado honesto: Si estás construyendo algo para que otros desarrolladores o máquinas lo consuman, usa JSON. Si estás entregando datos a un humano que los abrirá en una hoja de cálculo, usa CSV. Si estás construyendo un pipeline de datos que procesa millones de registros estructurados, considera NDJSON.

Conclusión

CSV y JSON no están realmente compitiendo — resuelven diferentes problemas. CSV es la herramienta correcta cuando tus datos son una tabla y quieres máxima compatibilidad con herramientas de hojas de cálculo y bases de datos. JSON es la herramienta correcta cuando tus datos tienen estructura, tipos o anidamiento, y cuando hablas con APIs o aplicaciones.

La decisión generalmente no es difícil una vez que miras la forma real de los datos. ¿Filas planas de lecturas de sensores? CSV. ¿Una respuesta API con perfiles de usuario anidados e historiales de pedidos incrustados? JSON. ¿Un registro de transmisión de eventos estructurados? NDJSON. Ajusta el formato a la forma de los datos y las herramientas en cada extremo, y raramente te equivocarás.