I sei modi in sintesi
Prima dei dettagli, ecco l’intero panorama in una sola passata, perché il modo più rapido per scegliere è eliminare cinque opzioni. Modo 1, la pagina di conversione lato client, non richiede nulla da installare e tiene il file sul tuo computer, ma devi ripetere i clic per ogni file. Modo 2, Python con la sola libreria standard, richiede Python 3 e nient’altro, gestisce perfettamente i dati piatti e lascia i valori annidati come testo repr di Python. Modo 3, Python con pandas, appiattisce gli oggetti annidati in colonne con notazione a punti in automatico, ma richiede pandas installato e ha comunque bisogno di una correzione in una riga per gli elenchi. Modo 4, jq, è un unico comando nel terminale per i dati piatti e fallisce in modo evidente, invece che in modo sbagliato, sui dati annidati. Modo 5, uno script Node, appiattisce gli oggetti annidati e unisce gli elenchi con una funzione che puoi leggere per intero, e si inserisce in modo naturale in un progetto. Modo 6, VS Code oppure Excel, non richiede una nuova installazione se usi già lo strumento e scambia controllo con comodità.
Due domande eliminano gran parte dell’elenco prima di proseguire nella lettura. Primo, i tuoi dati sono piatti oppure annidati? I dati piatti, un solo livello di chiavi per oggetto, funzionano con tutti e sei i modi. I dati annidati, oggetti dentro oggetti oppure elenchi dentro oggetti, escludono il semplice comando jq in una riga e il semplice script Python con libreria standard, a meno di aggiungere l’appiattimento. Secondo, lo farai di nuovo? Una conversione singola favorisce la pagina oppure lo strumento che hai già. Un’esportazione settimanale favorisce uno script, perché lo stesso comando produce le stesse colonne nello stesso ordine ogni volta. Tieni a mente queste due domande e il resto della guida diventa una tabella di consultazione.
Ogni affermazione di questa guida è stata provata sullo stesso campione prima della pubblicazione: tre ordini, ciascuno con un id, un oggetto cliente annidato con nome e città, un elenco di etichette e un totale. Dove un metodo gestisce solo dati piatti sono state usate varianti piatte dello stesso file. Quando un metodo fallisce sui dati annidati, questa guida lo dice e mostra il fallimento esatto invece di nasconderlo, perché un fallimento che puoi vedere è più sicuro di una tabella sbagliata che non puoi vedere.
Modo 1: la pagina di conversione lato client
Il modo locale più semplice è il convertitore in questa pagina, e conta come locale anche se si trova su un sito web. Quando incolli JSON oppure carichi un file, la pagina analizza il contenuto, lo appiattisce e costruisce il testo CSV dentro la scheda del browser, poi ti consegna il risultato come file scaricato. Non c’è alcun passaggio di caricamento verso un server e nessun server in attesa dei tuoi dati, perché il codice di conversione arriva insieme alla pagina e gira sul tuo computer. L’unico pulsante della pagina che tocca la rete è il pulsante opzionale di recupero da URL, che carica JSON da un indirizzo web che digiti tu. Incolla oppure carica invece di recuperare da URL, e la rete non viene mai usata.
Puoi verificare questa affermazione da solo in circa trenta secondi. Apri il convertitore, disconnettiti dalla rete oppure attiva la modalità aereo, poi incolla JSON e convertilo. Funziona comunque, perché nulla della conversione ha bisogno della rete. Vale la pena fare questa prova una volta, perché un’affermazione sulla privacy merita di essere verificata invece che accettata sulla fiducia, e questa la supera.
La pagina è il modo giusto per un file singolo, per un computer su cui non puoi installare nulla e per un file che vuoi convertire prima di impegnarti con uno script. I suoi limiti sono gli stessi di qualsiasi pagina: ripeti i clic per ogni file e un file molto grande rallenterà la scheda. Inoltre decide alcune cose al posto tuo, come l’ordine delle colonne e il comportamento di appiattimento, attraverso le sue opzioni invece che attraverso codice che controlli tu. Per un singolo file questi limiti non contano. Per un’esportazione settimanale, scegli uno script qui sotto e tieni la pagina come controllo rapido.
Modo 2: Python con la sola libreria standard
Python è il modo locale più utile per la maggior parte delle persone, perché è già installato sulla maggior parte dei computer degli sviluppatori e la sola libreria standard basta. Niente pandas, niente pacchetti, niente da scaricare. Lo script qui sotto legge un file JSON di oggetti, prende i nomi delle colonne dal primo oggetto e scrive un CSV con il modulo csv standard, che gestisce le virgolette in modo corretto da solo. Salvalo come json2csv.py ed eseguilo 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)Provato sul campione di tre ordini, questo script ha prodotto una riga di intestazione più tre righe di dati, e il risultato mostra il suo unico limite onesto in bella vista. L’oggetto cliente annidato è uscito come stringa repr di Python, come {'name': 'Ana', 'city': 'Lima'}, e l’elenco di etichette è uscito come elenco repr, come ['new', 'vip']. Un semplice DictWriter non appiattisce i valori annidati, quindi i dati piatti si convertono perfettamente e i dati annidati si convertono in modo visibilmente sbagliato, che almeno è facile da notare. La correzione è una breve funzione ricorsiva che trasforma gli oggetti annidati in chiavi con notazione a punti, customer.name e customer.city, prima della scrittura, ed è esattamente ciò che fa lo script Node nel Modo 5.
Il modulo csv sta facendo un lavoro reale per te. Mette tra virgolette le celle che contengono il delimitatore, raddoppia le virgolette interne e scrive i fine riga che il tuo foglio di calcolo si aspetta. Non costruire CSV unendo i valori con virgole da solo. Unire a mano si rompe alla prima virgola dentro un valore, e quella rottura è silenziosa: il file sembra a posto finché una colonna non si sposta. La versione con libreria standard funziona inoltre allo stesso modo su ogni computer con Python 3, ed è per questo che è il metodo da scegliere quando anche un collega deve eseguire la tua conversione.
Modo 3: Python con pandas json_normalize
Se il Modo 2 è il minimo onesto, il Modo 3 è l’aggiornamento che la maggior parte delle persone vuole davvero. La funzione pandas json_normalize prende gli oggetti annidati e li trasforma in colonne con notazione a punti in automatico, così customer diventa customer.name e customer.city senza alcuna funzione che scrivi tu. Lo script qui sotto legge lo stesso file di ordini, lo normalizza e scrive un CSV. Richiede pandas installato, cioè una sola installazione, e poi l’intero lavoro è di tre righe.
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)Provato sullo stesso campione di tre ordini, json_normalize ha prodotto le colonne id, tags, total, customer.name e customer.city, con tre righe. Questo è il comportamento da aspettarsi: gli oggetti annidati si appiattiscono, i campi piatti passano invariati e le colonne annidate appiattite arrivano dopo quelle piatte. Gli elenchi sono il problema restante. L’elenco di etichette è uscito come testo repr di Python, proprio come nel Modo 2, perché json_normalize non indovina cosa significa un elenco. La correzione in una riga è unire gli elenchi brevi prima della scrittura, per esempio df['tags'] = df['tags'].apply(lambda v: '; '.join(v) if isinstance(v, list) else v), che trasforma l’elenco in una cella leggibile. Per un elenco in cui ogni elemento dovrebbe diventare una riga a sé, si tratta di un’operazione diversa, l’esplosione, e pandas ha un passaggio explode separato per questo. La regola è semplice: l’appiattimento gestisce gli oggetti, l’unione gestisce gli elenchi brevi, l’esplosione gestisce gli elenchi che significano righe.
Pandas è il modo giusto quando i tuoi dati sono annidati, quando li pulirai o filtrerai prima della scrittura e quando lavori già in Python. È il modo sbagliato quando non è possibile installare un pacchetto, oppure quando il lavoro è un singolo file piatto che jq oppure la pagina finirebbero più in fretta. L’installazione è l’unico costo reale e si ripaga già alla seconda conversione.
Modo 4: jq, il comando in una riga per dati piatti
Se usi già il terminale, jq trasforma l’intero lavoro in una riga, per i dati piatti. Legge JSON, prende le chiavi dal primo oggetto come intestazione, poi emette ogni riga come riga CSV, con le virgolette gestite dal suo formattatore @csv. Nessun file di script, nessun ciclo, nessuna gestione manuale delle virgolette. Il comando qui sotto legge un file piatto di ordini, id, città e totale per ordine, e scrive orders.csv. Nota il limite, dichiarato in modo chiaro: il formattatore @csv rifiuta gli oggetti annidati e gli elenchi, quindi questo comando in una riga è solo per esportazioni piatte, e il campione annidato delle sezioni precedenti fallisce con un errore invece che con una tabella sbagliata, cioè il tipo sicuro di fallimento.
jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[] | @csv' orders-flat.json > orders.csvProvato su un file piatto di tre ordini, l’output è stato una riga di intestazione tra virgolette, "id","city","total", seguita da tre righe di dati con le celle di testo tra virgolette e i numeri senza virgolette, esattamente la forma che produce @csv. Il dettaglio keys_unsorted conta: il semplice keys ordinerebbe le colonne in ordine alfabetico, cambiando l’ordine delle colonne rispetto al tuo file. Se i tuoi dati hanno oggetti annidati, jq ha bisogno prima di un filtro di appiattimento, e il comando in una riga cresce fino a diventare un piccolo script. Per le esportazioni piatte, che è ciò che la maggior parte delle risposte di API in elenco sono già una volta estratte, il comando in una riga è l’intero lavoro, e gira offline su qualsiasi computer con jq installato.
Un’avvertenza: jq legge l’intero file in memoria, quindi un’esportazione di più gigabyte lo metterà sotto sforzo proprio come mette sotto sforzo una scheda del browser. Per le esportazioni ordinarie, fino a decine di megabyte, è istantaneo. Per file molto grandi, dividi prima il file oppure usa uno strumento in streaming, e trattalo come un problema separato dalla conversione.
Modo 5: Node, quando la conversione vive dentro un progetto
Node è il modo locale giusto quando la conversione fa parte di un progetto invece che di un compito singolo: un passaggio di build, una pipeline di dati, uno script che il team esegue già. Node include l’analisi JSON nativamente, quindi l’unico lavoro è trasformare le righe in testo CSV, e il piccolo script qui sotto lo fa con una funzione di appiattimento a punti, così gli oggetti annidati diventano colonne con notazione a punti, in linea con il comportamento della pagina di conversione. Salvalo come json2csv.mjs ed eseguilo 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'));Provato sullo stesso campione, lo script ha prodotto l’intestazione id,customer.name,customer.city,tags,total e tre righe, con l’oggetto cliente annidato appiattito in due colonne e l’elenco di etichette unito con punto e virgola e spazio. La funzione di escape segue la stessa regola usata dalla pagina di conversione: mettere una cella tra virgolette solo quando contiene il delimitatore, una virgoletta oppure un’interruzione di riga, e raddoppiare le virgolette interne. Quella regola è l’intera gestione delle virgolette in CSV, e applicarla nel modo giusto è la differenza tra un file che si apre in modo pulito e un file che sposta le colonne in silenzio.
Lo script è volutamente breve, così puoi leggerlo prima di eseguirlo. Prende l’unione di tutte le colonne tra le righe, quindi una riga a cui manca un campo ottiene una cella vuota, come nella pagina di conversione. Se ti serve lo streaming per file enormi, oppure la rinomina delle colonne, si tratta di aggiunte a questo script, non di sostituzioni.
Modo 6: gli strumenti che hai già, VS Code ed Excel
Altri due modi locali non richiedono una nuova installazione se usi già gli strumenti. In VS Code, un’estensione converte il file JSON aperto in CSV dalla palette dei comandi, ed è il percorso locale più rapido quando stai già modificando il file. La guida completa, con l’estensione da usare e i comandi esatti, è nella guida su VS Code collegata qui sotto. In Excel, Power Query legge un file JSON dal tuo disco e lo trasforma in una tabella senza che il file lasci mai il computer: Dati, Recupera dati, Da file, Da JSON, poi espandi le colonne e carica. Entrambi sono completamente offline una volta installato lo strumento, ed entrambi tengono il file sul tuo computer per tutto il tempo.
Questi modi scambiano controllo con comodità. VS Code ed Excel decidono al posto tuo la gestione delle colonne, e le loro impostazioni predefinite di solito vanno bene per i dati piatti e a volte sorprendono per i dati annidati. Se l’output sembra sbagliato, la diagnosi è la stessa che ovunque: controlla se i valori annidati sono stati appiattiti oppure lasciati come testo JSON, e controlla il delimitatore all’apertura. Per un file che converti una volta, entrambi i modi battono l’installazione di qualcosa di nuovo. Per un file che converti ogni settimana, uno script tuo batte entrambi, perché lo script non dipende dalla versione di un’estensione né da una finestra di dialogo da ripetere.
C’è un’altra nota onesta sul Modo 6. Excel e VS Code sono locali, ma non sono minimali: sono programmi grandi con le loro impostazioni, e un’impostazione può cambiare il risultato, per esempio una localizzazione che si aspetta punti e virgola invece di virgole. Se l’output differisce tra due computer, controlla le impostazioni dello strumento prima di dare la colpa ai dati. Gli script non hanno questo problema, perché lo script è l’impostazione.
A confronto: quale modo per quale situazione
Con tutti e sei i modi provati, la scelta diventa un breve elenco di decisioni. File singolo, niente da installare, privacy importante: la pagina di conversione. File piatto, vivi nel terminale, vuoi un solo comando: jq. File piatto oppure annidato, usi già Python, potresti ripetere il lavoro: Python con pandas. Nessun pacchetto consentito, oppure anche un collega deve eseguirlo: Python con libreria standard più una funzione di appiattimento per i dati annidati. Conversione dentro un progetto oppure un passaggio di build: lo script Node. Stai già modificando il file, oppure sei già in un foglio di calcolo: VS Code oppure Excel.
Due situazioni meritano una risposta diretta perché si presentano di continuo. Dati sensibili, dove il file deve restare sul computer: qualsiasi modo in questa pagina va bene, ma un breve script che leggi tu stesso è l’opzione più solida, perché non c’è nulla di nascosto di cui fidarsi. Leggi lo script prima di eseguirlo su dati sensibili, conserva il JSON originale e preferisci la pagina oppure uno script a qualsiasi strumento che carica il file. Esportazioni settimanali, dove la stessa forma arriva ancora e ancora: uno script, Python con pandas oppure Node, perché lo stesso comando produce le stesse colonne ogni volta, e lo script può essere programmato.
E due situazioni in cui nessun modo in questa pagina è la risposta giusta. Più persone hanno bisogno della stessa conversione con le stesse impostazioni: una pagina condivisa batte cinque copie di uno script che divergono tra loro. Un file più grande della memoria: ogni modo qui va sotto sforzo, e la correzione è dividere il file oppure elaborarlo riga per riga in streaming, che è un lavoro diverso dalla conversione. Nominare questi limiti fa parte del confronto, non è una lacuna.
Cosa perde ogni modo, e perché conservare l’originale
Ogni modo in questa pagina perde le stesse informazioni, perché la perdita sta nel cambio di formato, non nello strumento. I tipi diventano testo: un numero, un valore vero/falso e un null diventano tutti caratteri in una cella, e un foglio di calcolo potrebbe reinterpretarli all’apertura. Gli oggetti annidati diventano colonne con notazione a punti oppure celle unite, e gli elenchi diventano testo unito oppure righe aggiuntive, a seconda del modo scelto. Non c’è modo di tornare all’albero originale dal solo CSV, perché il CSV non registra quali colonne erano annidate, quali celle erano elenchi e quali valori erano numeri.
Per questo la prima regola della conversione locale è conservare il JSON originale. Non convertire mai sul posto sovrascrivendo la sorgente. Dai all’output un nome che si ordini bene, per esempio orders-2026-10-26.csv, e tieni il JSON accanto. Se il CSV risulta sbagliato, lo rigeneri dal JSON invece di correggere un file che ha già perso informazioni. Questa regola non costa nulla e previene l’unico fallimento che non puoi annullare.
La seconda regola è contare le righe. Il CSV dovrebbe avere una riga di intestazione più una riga per ogni oggetto nel JSON, e un conteggio rapido individua il fallimento più comune, cioè un rilevatore di righe che sceglie l’elenco sbagliato da una risposta avvolta. Se i conteggi non corrispondono, punta lo strumento verso l’elenco stesso, oppure estrai prima la risposta, prima di fidarti di qualsiasi riga.
Risoluzione dei problemi in tutti e sei i modi
Gli stessi quattro problemi si presentano in ogni modo, e ciascuno ha una sola correzione. Un’apertura in una sola colonna significa una mancata corrispondenza del delimitatore dal lato dell’apertura, non dati rotti: reimporta e scegli il delimitatore con cui è stato scritto il file. Dati annidati che compaiono come testo repr illeggibile oppure testo JSON nelle celle significa che l’appiattimento è stato saltato: lo script Python semplice e il comando jq in una riga non appiattiscono, quindi usa la versione pandas, lo script Node, oppure la pagina con l’interruttore di appiattimento attivo.
Colonne in un ordine diverso da quello del file significa che uno strumento ha ordinato le chiavi: jq ha bisogno di keys_unsorted, e lo script Node conserva l’ordine del primo incontro. Righe mancanti del tutto significa che il rilevatore di righe ha scelto un elenco diverso da quello che intendevi, cosa che accade con le risposte API avvolte: la pagina di conversione ha un passaggio di rilevamento delle righe, e uno script ha bisogno che l’elenco venga passato in modo esplicito. File non trovato significa che il terminale si trova in una cartella diversa da quella del file; controlla il percorso prima di qualsiasi altra cosa. JSON non valido significa che il file sorgente è rotto vicino alla posizione segnalata, di solito una virgoletta mancante oppure una virgola finale; convalidalo e correggi la sorgente, perché nessun convertitore dovrebbe indovinare su input rotto.
Guide correlate
- convert json to csv locally: convertire JSON in CSV sul tuo computer, senza caricare il file (Guida 2026)
- json to csv converter download: cosa scaricare davvero (Guida 2026)
- Come appiattire JSON in CSV: cosa fa davvero l'interruttore di appiattimento (Guida 2026)
- Il file CSV si apre in un'unica colonna in Excel: perché succede e come correggerlo (Guida 2026)
- Perché il tuo CSV mostra caratteri strani in Excel e come risolvere il problema di codifica (Guida 2026)
- Perché Excel elimina gli zeri iniziali dai codici del tuo CSV e come conservarli (Guida 2026)
- Perché Excel cambia le date del CSV e come mantenerle invariate (Guida 2026)
- Perché salvare un CSV in Excel lo modifica e come tenere al sicuro l'originale (Guida 2026)
- Perché Excel non apre il tuo file CSV troppo grande e cosa fare invece (Guida 2026)
Domande frequenti
Quali sono i modi per convertire JSON in CSV in locale?
Sei modi: una pagina di conversione lato client che gira nella scheda del browser, uno script Python che usa solo la libreria standard, Python con pandas json_normalize, un comando jq in una riga nel terminale, un piccolo script Node con una funzione di appiattimento a punti e gli strumenti che hai già, un’estensione di VS Code oppure Excel Power Query. Tutti e sei tengono il file sul tuo computer.
Quale modo locale è migliore per un file singolo?
La pagina di conversione. Incolla oppure carica il JSON, converti nella scheda, scarica il CSV, e non viene installato nulla. Puoi verificare che sia locale disconnettendoti dalla rete e convertendo comunque: funziona ancora, perché la conversione gira nel tuo browser.
Quale modo locale gestisce meglio JSON annidato?
Python con pandas json_normalize, lo script Node con una funzione di appiattimento a punti, oppure la pagina di conversione con l’interruttore di appiattimento attivo. Tutti e tre trasformano gli oggetti annidati in colonne con notazione a punti come customer.name. Lo script Python semplice lascia i valori annidati come testo repr, e il semplice comando jq in una riga fallisce sui dati annidati invece di produrre una tabella sbagliata.
Devo installare qualcosa per convertire JSON in CSV in locale?
No, se usi la pagina di conversione oppure uno strumento che hai già, come VS Code oppure Excel. Python 3 è già installato sulla maggior parte dei computer degli sviluppatori e la sua sola libreria standard gestisce i dati piatti. Pandas, jq e Node sono una sola installazione ciascuno e girano tutti completamente offline una volta installati.
Perché il mio CSV locale si apre come una sola colonna?
Si tratta di una mancata corrispondenza del delimitatore dal lato dell’apertura, non di dati rotti. Il tuo foglio di calcolo ha diviso il file su un delimitatore diverso da quello con cui è stato scritto. Reimporta il file e scegli il delimitatore corrispondente, e le colonne appariranno.
Perché i valori annidati compaiono come testo strano nel mio CSV?
Perché l’appiattimento è stato saltato. Lo script semplice con libreria standard di Python scrive gli oggetti annidati come testo repr di Python, e pandas lascia gli elenchi come testo repr a meno di unirli. Usa pandas json_normalize per gli oggetti più un’unione per gli elenchi brevi, oppure lo script Node, oppure la pagina di conversione con l’appiattimento attivo.
Convertire in locale perde informazioni?
Sì, le stesse informazioni che perde qualsiasi conversione. I valori sono conservati ma i tipi diventano testo, gli oggetti annidati diventano colonne con notazione a punti e gli elenchi diventano celle unite oppure righe aggiuntive. Non c’è modo di tornare all’albero originale dal solo CSV, quindi conserva sempre il file JSON originale.
Scegli il tuo modo e converti ora
Inizia con il modo locale più rapido: incolla qualsiasi JSON nel convertitore in questa pagina e guardalo convertirsi dentro la scheda del browser, senza caricamenti, senza registrazione, senza che nulla lasci il tuo computer. Oppure copia la versione Python, jq oppure Node ed eseguila sui tuoi file.
Apri il convertitore da JSON a CSV