1. Erinnern wir uns an JSON
JSON steht für JavaScript Object Notation. Trotz des etwas einschüchternden Wortes JavaScript im Namen ist dieses Format völlig sprachneutral und freundlich zu allen (na gut, fast allen) Programmiersprachen, einschließlich C#. Es wurde entwickelt, um Daten — Objekte, Arrays, Listen und Dictionaries — einfach und verständlich als normalen Text zu beschreiben.
In der heutigen Welt, in der nahezu jedes Programm mit anderen Programmen kommuniziert, ist JSON faktisch zum De-facto-Standard für Serialisierung und Austausch strukturierter Daten geworden. Es wird überall verwendet: von REST API bis zur Speicherung von Benutzereinstellungen und sogar für interne Kommunikation zwischen Microservices. Der Grund ist einfach — es ist für Menschen lesbar (sofern der Mensch keine Angst vor geschweiften Klammern hat), leicht zu parsen und wird von allen modernen Sprachen und Bibliotheken unterstützt.
Warum nicht XML?
JSON ist einfacher, kürzer und besser lesbar als XML. Außerdem ist es weniger noisy und passt logischer zu den Datenstrukturen der meisten Programmiersprachen. Und man muss sich nicht mit schließenden Tags, Anführungszeichen und sonstigem XML-Bürokratiekram herumschlagen. Kurz gesagt — JSON steht für schneller, einfacher, bequemer.
2. Hauptbestandteile der JSON-Syntax
Stell dir vor, JSON ist ein einfacher Baum (oder eine Matroschka), bestehend aus Objekten, Arrays und atomaren Daten. Das sind die Bausteine, mit denen wir arbeiten:
Objekte (Objects)
Ein JSON-Objekt ist eine Menge von "Schlüssel: Wert"-Paaren, umgeben von geschweiften Klammern { }.
Beispiel:
{
"name": "Alice",
"age": 23
}
In C# kann man so eine Struktur als Klasse oder Dictionary darstellen.
Arrays (Arrays)
Ein JSON-Array ist eine geordnete Liste von Elementen (Werten beliebigen Typs), eingeschlossen in eckige Klammern [ ].
Beispiel:
[1, 2, 3, 42]
Oder so:
[
{"name": "Ivan"},
{"name": "Olga"}
]
In C# entspricht das List<T>, T[] und ähnlichen Collections.
Schlüssel-Wert-Paare
Schlüssel sind immer Strings (in doppelten Anführungszeichen!), und Werte können beliebige in JSON erlaubte Datentypen sein.
Beispiel:
{
"id": 123,
"login": "student",
"isActive": true
}
Datentypen in JSON
| JSON-Typ | Beispiel | Beschreibung |
|---|---|---|
| Zahl (Number) | |
Ganze oder gebrochene Zahl |
| String (String) | |
Immer in doppelten Anführungszeichen |
| Boolesch (Boolean) | |
Logischer Wert |
| null | |
Abwesenheit eines Werts |
| Objekt (Object) | |
Dictionary oder Entität mit Feldern |
| Array (Array) | |
Sequenz von Werten |
Beispiel — alles zusammen:
{
"id": 1,
"name": "Bob",
"scores": [10, 20, 30],
"profile": {
"email": "bob@mail.com",
"phone": null
},
"isAdmin": false
}
Siehst du, wie kompakt und logisch man ein ganzes Benutzerobjekt beschreiben kann.
3. Formatierungsregeln für JSON
Strings immer in doppelten Anführungszeichen
Auch wenn man sehr gern einfache Anführungszeichen verwenden würde, JSON verzeiht das nicht. So ist es korrekt:
{ "name": "Vera" }
So ist es falsch:
{ 'name': 'Vera' }
Schlüssel — nur Strings
Im Gegensatz zu C#, wo ein Dictionary-Key auch int oder enum sein kann, ist im JSON der Key immer ein String:
{ "2025": "God C#", "favorite": true }
Keine trailing commas
Im Gegensatz zu einigen C#-Notation dürfen überflüssige Kommata vor der schließenden Klammer nicht stehen — das ist ein Syntaxfehler in JSON!
// FEHLER! (letztes Komma ist nicht erlaubt)
{
"id": 10,
"name": "Oleg",
}
Korrekt:
{
"id": 10,
"name": "Oleg"
}
Leerzeichen und Zeilenumbrüche
Man kann sie zur besseren Lesbarkeit einfügen; Parser ignorieren sie. Üblicherweise nutzt man für "für Menschen" formatiertes JSON pretty-printed, für Netzwerkübertragungen oft minified (in einer Zeile, ohne Leerzeichen).
4. Wie C#-Objekte in JSON umgewandelt werden
Wenn du ein Objekt mit System.Text.Json.JsonSerializer.Serialize() serialisierst, werden Felder und Properties des Objekts zu Schlüssel-Wert-Paaren.
Beispiel: C#-Klasse und Serialisierung
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}
Collections
- List<int> wird zu [1,2,3]
- string[] wird zu ["hi", "wow"]
- List<Person> — zu einem Array von Objekten
Dictionaries
Ein Dictionary vom Typ Dictionary<string, int> wird zu einem Objekt:
var dict = new Dictionary<string, int>
{
["apples"] = 5, ["bananas"] = 10
};
string json = JsonSerializer.Serialize(dict);
// {"apples":5,"bananas":10}
5. Visuelle Darstellung: wie JSON aufgebaut ist
Verschachtelung — wie eine Matroschka
Objekt
│
├── Paar: "name": "Alex"
├── Paar: "hobbies": Array
│ │
│ ├── "skiing"
│ └── "programming"
└── Paar: "profile": Objekt
│
├── "age": 42
└── "city": "Basel"
Als Ergebnis:
{
"name": "Alex",
"hobbies": ["skiing", "programming"],
"profile": {
"age": 42,
"city": "Basel"
}
}
6. Typische Fehler und Besonderheiten der Syntax
In der Programmierung gibt es keinen perfekten Zustand — selbst in JSON lauern Fallstricke! Wenn du JSON mit falschen Anführungszeichen, mit überflüssigen Kommata oder mit Schlüsseln ohne Anführungszeichen verschickst, wird der Parser einen Fehler melden.
Eine weitere "Falle" sind Zahlen mit führenden Nullen. Das ist in JSON verboten (zum Beispiel 0123 — Fehler).
Gut zu wissen: Manche Parser (z. B. der JavaScript-Parser JSON.parse) sind toleranter und können kleine Verstöße verzeihen. Die meisten strengen Parser (z. B. in C# und .NET) hingegen meckern bei jeder kleinen Syntaxverletzung.
7. Beispiele: Umwandlung von C#-Daten in JSON
Lass uns eine komplexe Struktur praktisch serialisieren. Unsere Lernanwendung wächst: nehmen wir an, wir haben jetzt eine Liste von Studenten, die wir in einer JSON-Datei speichern wollen.
Klasse definieren:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
Liste füllen:
var students = new List<Student>
{
new Student { Name = "Anna", Age = 20 },
new Student { Name = "Nikita", Age = 22 }
};
Serialisierung:
using System.Text.Json;
// Wir serialisieren die Studentenliste in einen JSON-String
string json = JsonSerializer.Serialize(students, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(json);
/*
[
{
"Name": "Anna",
"Age": 20
},
{
"Name": "Nikita",
"Age": 22
}
]
*/
Siehst du, wie praktisch das ist? Jeder Student ist ein eigenes Objekt im JSON-Array.
8. Mini-Generator: wie man JSON "von Hand" schreibt
Manchmal muss man JSON manuell schreiben, z. B. um Testdaten zu erstellen. Hier eine Checkliste:
- Äußere geschweifte Klammern — für ein Objekt, äußere eckige Klammern — für ein Array.
- Der Schlüssel ist immer ein String in doppelten Anführungszeichen.
- Werte — Strings (in doppelten Anführungszeichen), Zahlen, true, false, null, Objekt ({}), Array ([]).
- Nur Kommata zwischen Elementen, nicht nach dem letzten!
- Einrückungen und Leerzeichen für Lesbarkeit (aber nicht verpflichtend).
GO TO FULL VERSION