1. Ricordiamo JSON
JSON sta per JavaScript Object Notation. Nonostante la parola minacciosa JavaScript nel nome, questo formato è totalmente language-neutral e amichevole con tutti (o quasi tutti) i linguaggi di programmazione, incluso C#. È stato creato per descrivere dati in modo comodo e leggibile — oggetti, array, liste e dizionari — come testo normale.
Nel mondo moderno, dove quasi ogni programma parla con altri programmi, JSON è diventato di fatto lo standard de-facto per serializzazione e scambio di dati strutturati. Lo trovi ovunque: dai REST API alla memorizzazione delle impostazioni utente e persino per la comunicazione interna tra microservizi. La ragione è semplice — è leggibile dall'uomo (se l'uomo non teme le parentesi graffe), facile da fare il parsing e supportato da tutti i linguaggi e librerie moderne.
Perché non XML?
JSON è più semplice, più corto e più leggibile di XML. Inoltre non ha rumore o tag superflui, si adatta meglio alle strutture dati della maggior parte dei linguaggi. E non devi preoccuparti di tag di chiusura, virgolette e tutta la burocrazia XML. Insomma — JSON è su più veloce, più semplice, più comodo.
2. Elementi principali della sintassi JSON
Immagina JSON come un albero semplice (o una matrioska), fatto di oggetti, array e dati elementari. Ecco i "mattoni" a nostra disposizione:
Oggetti (Objects)
Un oggetto JSON è un insieme di coppie "chiave: valore", racchiuso tra parentesi graffe { }.
Esempio:
{
"name": "Alice",
"age": 23
}
In C# questa struttura può essere rappresentata come una classe o un dizionario.
Array (Arrays)
Un array JSON è una lista ordinata di elementi (valori di qualsiasi tipo), racchiusa tra parentesi quadre [ ].
Esempio:
[1, 2, 3, 42]
O così:
[
{"name": "Ivan"},
{"name": "Olga"}
]
In C# — questo è List<T>, T[] e collezioni simili.
Coppie "chiave-valore"
Le chiavi sono sempre stringhe (con virgolette doppie!), e i valori possono essere di qualsiasi tipo consentito in JSON.
Esempio:
{
"id": 123,
"login": "student",
"isActive": true
}
Tipi di dati in JSON
| Tipo JSON | Esempio | Descrizione |
|---|---|---|
| Numero (Number) | |
Numero intero o decimale |
| Stringa (String) | |
Sempre tra virgolette doppie |
| Booleano (Boolean) | |
Valore logico |
| null | |
Assenza di valore |
| Oggetto (Object) | |
Dizionario o entità con campi |
| Array (Array) | |
Sequenza di valori |
Esempio — tutto insieme:
{
"id": 1,
"name": "Bob",
"scores": [10, 20, 30],
"profile": {
"email": "bob@mail.com",
"phone": null
},
"isAdmin": false
}
Vedi quanto è compatto e logico descrivere un intero oggetto utente.
3. Regole di formattazione JSON
Le stringhe sono sempre tra virgolette doppie
Anche se ti viene voglia di mettere quelle singole, JSON non lo permette. Così — corretto:
{ "name": "Vera" }
Così — errore:
{ 'name': 'Vera' }
Le chiavi sono solo stringhe
A differenza di C#, dove la chiave di un dizionario può essere int o enum, in JSON la chiave è sempre una stringa:
{ "2025": "God C#", "favorite": true }
Niente virgole finali
Diversamente da alcune sintassi di C#, una virgola in più prima della parentesi di chiusura è un errore sintattico in JSON!
// ERRORE! (l'ultima virgola non è ammessa)
{
"id": 10,
"name": "Oleg",
}
Corretto:
{
"id": 10,
"name": "Oleg"
}
Spazi e ritorni a capo
Si possono usare per bellezza, i parser li ignorano. Di solito per il formato "per umani" si usa il JSON pretty-printed (formattato), per l'invio in rete si usa il minified (in una riga, senza spazi).
4. Come gli oggetti C# vengono convertiti in JSON
Se serializzi un oggetto usando System.Text.Json.JsonSerializer.Serialize(), i campi e le proprietà dell'oggetto diventano coppie "chiave-valore".
Esempio di classe C# e serializzazione
public class Book
{
public string Title { get; set; }
public int Pages { get; set; }
}
var book = new Book { Title = "CLR via C#", Pages = 900 };
string json = JsonSerializer.Serialize(book);
Console.WriteLine(json); // {"Title":"CLR via C#","Pages":900}
Collezioni
- List<int> diventa [1,2,3]
- string[] diventa ["hi", "wow"]
- List<Person> — in un array di oggetti
Dizionari
Un dizionario del tipo Dictionary<string, int> diventa un oggetto:
var dict = new Dictionary<string, int>
{
["apples"] = 5, ["bananas"] = 10
};
string json = JsonSerializer.Serialize(dict);
// {"apples":5,"bananas":10}
5. Schema visivo: come si costruisce JSON
Annidamento — come una matrioska
Oggetto
│
├── Coppia: "name": "Alex"
├── Coppia: "hobbies": array
│ │
│ ├── "skiing"
│ └── "programming"
└── Coppia: "profile": oggetto
│
├── "age": 42
└── "city": "Basilea"
Il risultato:
{
"name": "Alex",
"hobbies": ["skiing", "programming"],
"profile": {
"age": 42,
"city": "Basilea"
}
}
6. Errori comuni e particolarità della sintassi
In programmazione il mondo perfetto non esiste — anche in JSON ci sono delle trappole! Se provi a inviare JSON con virgolette sbagliate, virgole in eccesso o chiavi non racchiuse tra virgolette — il parser darà errore.
Un'altra "sorpresa" sono i numeri con zeri iniziali. In JSON questo è vietato (per esempio, 0123 — è un errore).
Buono a sapersi: Alcuni parser (per esempio il JavaScript JSON.parse) sono più permissivi e possono "perdonare" piccole irregolarità. Ma la maggior parte dei parser "severi" (per esempio in C# e .NET) si lamenterà al minimo problema di sintassi.
7. Esempi di conversione di dati C# in JSON
Proviamo a serializzare una struttura più complessa nella pratica. La nostra app didattica cresce: immaginiamo di avere una lista di studenti e di volerla salvare in un file JSON.
Definiamo la classe:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
Riempiamo la lista:
var students = new List<Student>
{
new Student { Name = "Anna", Age = 20 },
new Student { Name = "Nikita", Age = 22 }
};
Serializzazione:
using System.Text.Json;
// Serializziamo la lista di studenti in una stringa JSON
string json = JsonSerializer.Serialize(students, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(json);
/*
[
{
"Name": "Anna",
"Age": 20
},
{
"Name": "Nikita",
"Age": 22
}
]
*/
Vedi quanto è comodo? Ogni studente è un oggetto separato dentro l'array JSON.
8. Mini-generator: come scrivere JSON "a mano"
A volte serve scrivere JSON manualmente, per esempio per creare dati di test. Ecco una checklist:
- Parentesi graffe esterne — per un oggetto, parentesi quadre esterne — per un array.
- La chiave è sempre una stringa tra virgolette doppie.
- I valori possono essere stringhe (tra virgolette doppie), numeri, true, false, null, oggetto ({}), array ([]).
- Solo virgole tra gli elementi, mai dopo l'ultimo!
- Indentazione e spazi per leggibilità (ma non obbligatori).
GO TO FULL VERSION