JSON è la lingua delle API; CSV è la lingua dei fogli di calcolo, dei database e degli analisti. Convertire tra i due è un compito quotidiano —— esportare una risposta API in Excel, o convertire un foglio in JSON per importarlo. Questa guida mostra come convertire JSON in CSV e CSV in JSON, in JavaScript, in Python e all'istante nel browser —— e i casi limite (dati annidati, virgolette, tipi) su cui si inciampa di più.
Il mapping centrale: Array di oggetti ⇄ Righe
Un file CSV è una tabella: una riga di intestazione con i nomi delle colonne, poi una riga per ogni record. La forma JSON che si mappa naturalmente a quella tabella è un array di oggetti, dove ogni oggetto è una riga e ogni chiave è una colonna.
// 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,falseL'intestazione è l'unione delle chiavi di tutti gli oggetti (così oggetti con campi diversi restano allineati), e ogni riga prende il valore corrispondente per ciascuna colonna.
Come convertire JSON in CSV in JavaScript
Non esiste un JSON.toCSV integrato, ma la conversione è breve. L'unico lavoro vero è l'escape: qualunque valore che contiene una virgola, una virgoletta doppia o un a-capo va racchiuso tra virgolette doppie, e le virgolette interne vanno raddoppiate.
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');
} Nota il ramo typeof v === 'object': un oggetto o array annidato non ha rappresentazione CSV piatta, quindi la convenzione comune è serializzarlo come testo JSON dentro la cella. Più sotto.
Come convertire CSV in JSON in JavaScript
Il problema in senso inverso è fare il parsing del CSV correttamente —— i campi possono contenere virgole e a-capo dentro virgolette, quindi non basta split(','). Usa una piccola macchina a stati (o, in produzione, una libreria come papaparse):
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] ?? ''])));
}Come convertire JSON e CSV in Python
La libreria standard di Python lo include già —— niente dipendenze.
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)I casi limite che contano davvero
Oggetti e array annidati
CSV è piatto; JSON no. Quando il valore è un oggetto o array, hai due opzioni: serializzarlo come JSON in una cella (semplice, reversibile) o appiattirlo su più colonne tipo address.city, address.zip (leggibile, ma con perdita e difficile da invertire). Per il round-trip, JSON-in-cella è la scelta più sicura.
CSV perde i tipi
CSV non ha tipi —— ogni campo è testo. Passando da CSV a JSON, "1" è una stringa, a meno che tu non lo converta deliberatamente in numero. Attento a valori come 007 (un CAP/ID che deve restare stringa) o interi enormi che perdono precisione facendo cast a Number. Converti solo quando il round-trip è senza perdita.
Virgolette e delimitatori
Quota sempre i campi con virgole, virgolette o a-capo. Alcuni locali (comune nell'Excel europeo) usano ; come delimitatore —— se il CSV appare strano in qualche colonna, controlla prima il delimitatore.
Chiavi non coerenti
Se i tuoi oggetti JSON non condividono tutti le stesse chiavi, costruisci l'intestazione con l'unione delle chiavi e lascia vuote le celle mancanti —— non dare per scontato che il primo oggetto definisca tutte le colonne.
Excel e il BOM UTF-8
Se il CSV va aperto in Excel e contiene caratteri non ASCII, anteponi un BOM UTF-8 (i byte 0xEF 0xBB 0xBF). Excel legge UTF-8 senza BOM come la codifica legacy e rovina accenti/caratteri asiatici. La maggior parte delle librerie CSV emette il BOM tramite un'opzione.
// JavaScript —— scrivi un BOM così Excel legge UTF-8 correttamente
const out = '\uFEFF' + jsonToCsv(rows);Delimitatori alternativi (CSV vs TSV vs ;)
„CSV“ non è sempre separato da virgole. Varianti comuni:
- TSV —— separato da tabulazioni; più sicuro quando i valori contengono spesso virgole.
- Excel europeo emette
;come delimitatore nelle regioni in cui la virgola è il separatore decimale.
Se l'output sembra ammassato in una singola colonna strana all'apertura, il file usa un delimitatore diverso da quello che il lettore si aspetta. Standardizzane uno (CSV con , + BOM per Excel cross-regione, o TSV per pipeline di ingegneria).
Per CSV del mondo reale usa PapaParse
Per parsare nel browser/Node CSV che arriva da utenti, usa PapaParse —— gestisce rilevamento del delimitatore, campi quotati, valori multilinea, righe di intestazione e dynamicTyping per convertire numeri e booleani. Gli snippet a mano qui sopra vanno bene per input semplici e fidati; in scala si usa PapaParse.
Converti JSON in CSV online —— niente installazione
Per una conversione una tantum, salta del tutto il codice. Incolla il tuo JSON nel convertitore JSON in CSV di fixjson e clicca To CSV, o incolla CSV e clicca To JSON. Gestisce escape, unione di chiavi e coercizione dei tipi automaticamente, e gira interamente nel tuo browser —— niente viene caricato, importante quando i dati contengono record di clienti o esportazioni interne.
Domande frequenti
Come converto JSON in CSV?
Prendi un array JSON di oggetti, costruisci una riga di intestazione con l'unione di tutte le chiavi e scrivi una riga per oggetto —— quotando ogni valore con virgola, virgolette o a-capo. Usa csv.DictWriter in Python, una piccola funzione in JavaScript, o incolla nel convertitore online.
Come converto CSV in JSON?
Fai il parsing del CSV (rispettando i campi quotati), tratta la prima riga come intestazione e mappa ogni riga successiva a un oggetto con quelle intestazioni come chiavi. Ricorda che tutti i valori arrivano come stringa, a meno che tu non li converta.
Come si rappresentano gli oggetti JSON annidati in CSV?
CSV non annida, quindi un oggetto o array annidato di solito si scrive come testo JSON in una singola cella, o si appiattisce in colonne con punti come address.city. JSON-in-cella è la scelta reversibile.
Posso convertire JSON in CSV online gratis?
Sì —— il convertitore di fixjson fa entrambe le direzioni gratis, totalmente nel browser, senza account o upload.
Strumenti e guide correlate
- Convertitore JSON ⇄ CSV —— converte in entrambe le direzioni nel browser
- Come convertire CSV e XML in JSON —— la direzione inversa, più XML
- Cos'è JSON? —— i tipi di dato dietro la conversione
- Validatore JSON —— verifica che il tuo JSON faccia il parse prima di convertire