Cómo funciona la conversión
JSON a CSV: cada objeto del array pasa a ser una fila. Las columnas son todas las claves que aparecen en algún objeto, en el orden en que aparecen por primera vez, así que un objeto sin una clave simplemente recibe una celda vacía. Los objetos anidados se aplanan en columnas con punto, como host.name, y los arrays se escriben como texto JSON en una celda, porque una lista no cabe en una sola columna de una hoja de cálculo. Los números se conservan exactamente como están escritos, así que los ID largos no se redondean.
Las comillas siguen la RFC 4180, el estándar de CSV: un valor que contiene el delimitador, unas comillas dobles o un salto de línea se envuelve entre comillas dobles, y unas comillas dentro de él se escriben dos veces. Los demás valores se quedan como están. Elige el punto y coma si tu hoja de cálculo usa la coma para los decimales, como hace Excel en buena parte de Europa.
CSV a JSON: el analizador lee campos entre comillas, comillas escritas dos veces, saltos de línea dentro de comillas y finales de línea CRLF, LF o CR. Detecta el delimitador a partir de las primeras filas, buscando el que las divide en el mismo número de campos. Con una fila de encabezado se obtiene un objeto por fila; sin ella, un array por fila. La conversión de tipos convierte 42, 3.5, true, false y null en valores JSON, pero deja 007 y los números muy largos como texto, para que los códigos postales y los ID sobrevivan.
Ejemplo
Dos servidores, uno con un objeto host anidado y una lista de puertos, y el otro sin dirección IP y con una coma en su nota:
[
{ "id": 1, "host": { "name": "web-1", "ip": "203.0.113.10" }, "ports": [80, 443] },
{ "id": 2, "host": { "name": "db-1" }, "note": "primary, eu" }
]Las columnas son la unión de todas las claves. host pasa a ser host.name y host.ip, el array ports se queda como texto JSON y va entre comillas porque contiene una coma, la IP y los puertos que faltan son celdas vacías, y la nota va entre comillas por su coma:
id,host.name,host.ip,ports,note
1,web-1,203.0.113.10,"[80,443]",
2,db-1,,,"primary, eu"
Al convertir ese CSV de vuelta con los tipos y el anidamiento activados se obtienen de nuevo los objetos. El id vuelve a ser un número y host un objeto, pero los puertos vuelven como el texto "[80,443]" y las celdas vacías como cadenas vacías, porque una celda de CSV no puede indicar que era una lista o que faltaba:
[
{"id":1,"host":{"name":"web-1","ip":"203.0.113.10"},"ports":"[80,443]","note":""},
{"id":2,"host":{"name":"db-1","ip":""},"ports":"","note":"primary, eu"}
]Preguntas
¿Cómo convierto JSON a CSV?
Pega el JSON arriba o abre un archivo .json, deja seleccionado JSON → CSV y elige un delimitador. El CSV aparece al instante con una vista previa en tabla; cópialo o descárgalo como archivo .csv y ábrelo en Excel, Google Sheets o LibreOffice. El JSON debería ser un array de objetos, pero también valen un solo objeto, una respuesta de API con un array dentro y JSON Lines.
¿Cómo convierto CSV a JSON?
Cambia la dirección a CSV → JSON y pega después el CSV o abre un archivo .csv. El delimitador se detecta solo. Con la primera fila como nombres de columna, cada fila pasa a ser un objeto; desactívalo para obtener arrays. Activa la conversión de tipos para obtener números y true o false en lugar de cadenas, y el anidamiento para volver a convertir en objetos las columnas como server.cpu.
¿Qué pasa con los objetos y arrays JSON anidados?
Los objetos anidados se aplanan en columnas con punto: un objeto host con un name pasa a ser una columna host.name, a toda la profundidad que tenga. Los arrays se escriben como texto JSON en una sola celda, como [80,443], porque una lista no tiene un lugar natural en una celda. Desactiva el aplanado para conservar también los objetos anidados como texto JSON.
¿Por qué Excel pone mi CSV en una sola columna o rompe los acentos?
Excel usa el separador de listas de tu sistema: donde la marca decimal es una coma, como en España, Alemania o Francia, espera puntos y coma. Elige «Punto y coma» aquí y las columnas se separan. Los acentos rotos significan que Excel leyó el archivo con una página de códigos antigua en lugar de UTF-8; marca la opción de la marca de orden de bytes antes de descargar, o importa el archivo con Datos → Desde texto o CSV y elige UTF-8.
¿Cómo convierto JSON a CSV en la línea de comandos?
Con jq, para un array de objetos planos: jq -r '(.[0] | keys_unsorted) as $k | $k, (.[] | [.[$k[]]]) | @csv' data.json > data.csv. Toma las columnas solo del primer objeto. Para CSV a JSON, Python no necesita ningún paquete adicional: python3 -c "import csv,json,sys; print(json.dumps(list(csv.DictReader(sys.stdin))))" < data.csv.