← Tutti gli articoli

Come convertire CSV e XML in JSON

Converti CSV e XML in JSON in JavaScript, Python e nel browser. Copre il mapping array-di-oggetti, la gestione degli attributi XML e i tranelli di coercizione di tipo.

CSV e XML sono ovunque —— export di fogli di calcolo, API legacy, feed aziendali —— ma la maggior parte del codice moderno vuole JSON. Convertire fra loro è semplice una volta capite le regole di mapping e i tranelli (tutto in CSV è stringa; gli attributi XML e gli elementi ripetuti vogliono un trattamento speciale). Questa guida copre entrambe le conversioni in JavaScript, Python e nel browser.

Ambito: questo articolo è la how-to ampia che copre CSV → JSON e XML → JSON in un colpo solo. Se ti serve specificamente XML —— attributi, nodi di testo, elementi ripetuti e namespace in profondità —— leggi Conversione XML in JSON: attributi, nodi di testo, array e namespace. Per la direzione inversa vedi JSON in XML.

Convertire CSV in JSON

Un file CSV è fatto di righe di valori separati da virgola, di solito con una riga di intestazione. La rappresentazione JSON naturale è un array di oggetti, uno per riga, indicizzati dall'intestazione:

# CSV
id,name,active
1,Ada,true
2,Bob,false
// JSON
[
  { "id": "1", "name": "Ada", "active": "true" },
  { "id": "2", "name": "Bob", "active": "false" }
]

Nota che ogni valore è una stringa —— CSV non ha tipi. Convertire "1" in numero o "true" in booleano è un passo di coercion separato che devi fare di proposito.

CSV in JSON in JavaScript

Per CSV fidato e semplice puoi fare split a mano —— ma il CSV reale ha campi quotati con virgole e a-capo, quindi in produzione usa un parser serio come papaparse:

// Parser minimale —— sicuro solo per CSV semplici e senza quote
function csvToJson(csv) {
  const [header, ...rows] = csv.trim().split('\n');
  const keys = header.split(',');
  return rows.map((row) => {
    const values = row.split(',');
    return Object.fromEntries(keys.map((k, i) => [k, values[i]]));
  });
}

// Produzione —— gestisce quote, virgole interne, a-capo
import Papa from 'papaparse';
const result = Papa.parse(csvText, { header: true, dynamicTyping: true });
// dynamicTyping converte automaticamente "1" → 1 e "true" → true

CSV in JSON in Python

import csv, json

with open('data.csv', newline='') as f:
    rows = list(csv.DictReader(f))   # lista di dict indicizzati dall'intestazione

print(json.dumps(rows, indent=2))

Convertire XML in JSON

XML è più insidioso perché ha concetti che JSON non ha: attributi, nodi di testo, e elementi singoli-vs-ripetuti. Non c'è un unico mapping „corretto“, quindi scegli una convenzione e applicala con coerenza.

<!-- XML -->
<user id="1">
  <name>Ada</name>
  <role>admin</role>
  <role>editor</role>
</user>
// Un mapping JSON comune
{
  "user": {
    "@id": "1",                    // attributo, con prefisso @
    "name": "Ada",                 // figlio singolo → valore
    "role": ["admin", "editor"]    // figlio ripetuto → array
  }
}

XML in JSON in JavaScript

import { XMLParser } from 'fast-xml-parser';

const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@' });
const obj = parser.parse(xmlString);
// Nel browser puoi anche usare DOMParser e camminare l'albero dei nodi a mano.

XML in JSON in Python

import xmltodict, json

doc = xmltodict.parse(xml_string)   # gli attributi diventano chiavi "@name"
print(json.dumps(doc, indent=2))

Tranelli di mapping da tenere d'occhio

  • I tipi si perdono. I valori CSV e XML arrivano come stringhe. Fai cast esplicito di numeri e booleani —— non assumere che il parser l'abbia fatto.
  • Singolo vs ripetuto. Un <role> diventa un valore; due diventano un array. Decidi se un campo deve essere sempre un array per non far sorprendere i consumatori.
  • Attributi vs elementi figli.Scegli una convenzione di prefisso (comunemente @) e documentala.
  • Valori vuoti e whitespace. Elementi XML vuoti e virgole finali nel CSV possono produrre null, "" o chiavi mancanti a seconda del parser.

BOM e bizzarrie di codifica

I file esportati da Excel e da alcuni strumenti Windows iniziano con un BOM UTF-8 (0xEF 0xBB 0xBF). Rimuovilo prima del parsing, altrimenti la tua prima intestazione / nome di elemento lo includerà di nascosto. La RFC 8259 vieta il BOM all'inizio del JSON, quindi qualunque convertitore tu costruisca deve toglierlo dall'input invece di copiarlo nell'output.

TSV vs CSV (e altri delimitatori)

„CSV“ non è sempre separato da virgole. I valori separati da tabulazione (TSV) sono comuni nelle pipeline di ingegneria perché le tab quasi mai compaiono nei valori, così si salta tutta la macchina del quoting. Gli export di Excel europei usano spesso ;. Se l'output sembra una colonna strana, il file usa un delimitatore diverso da quello che il parser si aspetta —— cambia il delimitatore o usa una libreria che lo rilevi.

Namespace XML

Gli elementi XML possono essere qualificati con un prefisso di namespace (es. <soap:Envelope>) legato a una dichiarazione xmlns. JSON non ha il concetto di namespace, quindi la maggior parte dei convertitori sceglie una di tre strade: tenere il prefisso nella chiave ("soap:Envelope"), toglierlo, o salvare le dichiarazioni xmlns come attributi @xmlns:*. Tenere il prefisso è l'unica opzione senza perdita. Per l'approfondimento vedi Conversione XML in JSON.

Valida e formatta il risultato

Dopo la conversione, conferma che l'output sia ben formato e leggibile:

Domande frequenti

Come converto CSV in JSON?

Parsa il CSV in righe e mappa ciascuna a un oggetto indicizzato dall'intestazione —— usa csv.DictReader in Python o una libreria come papaparse in JavaScript. Ricorda che tutti i valori partono come stringhe; i cast di tipo falli tu.

Perché tutti i miei valori CSV-a-JSON sono stringhe?

CSV non ha tipi —— ogni campo è testo. Abilita la coercion dei tipi (es. dynamicTyping di papaparse) o converti numeri e booleani esplicitamente dopo il parse.

Come gestisco gli attributi XML quando converto in JSON?

La maggior parte dei convertitori mappa gli attributi su chiavi con un prefisso come @ (es. @id). Scegli una convenzione e applicala con coerenza così il codice a valle sa dove guardare.

Perché l'output XML-a-JSON a volte mi dà un oggetto e a volte un array?

Un elemento figlio singolo mappa a un valore; un elemento ripetuto mappa a un array. Configura il parser per trattare certi elementi sempre come array se i consumatori si aspettano una forma coerente.

Converti, valida e formatta nel browser