JSON in C# dynamic im Jahr 2025: schmerzfreie Deserialisierung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

JSON und C# dynamic: Warum es immer noch eine Qual ist (und wie man sie heilt)

\n\n

Haben Sie jemals auf eine JSON-Antwort einer API geschaut und gedacht: „Mein Gott, warum bist du nur so kompliziert?“ Besonders wenn sich die Datenstruktur jedes Mal ändert wie das Wetter in St. Petersburg. Ein klassisches Beispiel ist die Antwort eines externen Dienstes, bei dem Felder mal Strings, mal Arrays oder sogar null sein können. Oder wenn Sie schnell JSON parsen müssen, aber dafür eine separate Klasse zu erstellen – das ist, als würde man einen Mikrochip mit einem Mikroskop sägen.

\n\n

Für genau solche Fälle gibt es in C# die Magie von dynamic. Die Frage „Deserialize JSON into C# dynamic object?“ auf Stack Overflow hat tausende Aufrufe – und das nicht ohne Grund. Im Jahr 2025, in dem Microservices und dynamische APIs zur Norm geworden sind, ist die Fähigkeit, schnell und flexibel mit JSON zu arbeiten, eine Superkraft für Entwickler.

\n\n

In diesem Artikel werden wir die besten Praktiken zur Deserialisierung von JSON in dynamic-Objekte in C# behandeln. Keine langweilige Theorie, nur Code, Beispiele und echte Lifehacks. Los geht's!

\n\n

Warum dynamic? Und nicht einfach JObject?

\n\n

Gute Frage. In C# gibt es JObject (von Newtonsoft.Json) und JsonDocument (von System.Text.Json). Sie können JSON ebenfalls „on the fly“ parsen. Aber dynamic bietet eine wichtige Sache – syntaktischen Zucker.

\n\n

Vergleichen Sie:

\n\n
// Über JObject\nvar json = JObject.Parse(rawJson);\nvar name = (string)json["user"]["name"];\n\n// Über dynamic\ndynamic obj = JsonConvert.DeserializeObject<dynamic>(rawJson);\nvar name = obj.user.name;\n
\n\n

Die zweite Variante liest sich wie normaler Code und nicht wie „Hole den Schlüssel, caste den Typ, prüfe auf null“. Das ist besonders praktisch, wenn JSON tief verschachtelt ist.

\n\n

Methode 1: Klassiker – Newtonsoft.Json (Json.NET)

\n\n

Ja, wir haben das Jahr 2025, aber Newtonsoft.Json ist immer noch lebendig und munter. Viele Legacy-Projekte und auch einige moderne verwenden es immer noch. Warum? Flexibilität, Erweiterbarkeit und eine Million Einstellungen.

\n\n

Basisbeispiel

\n\n
using Newtonsoft.Json;\n\nstring json = @"\n{\n    'name': 'Alexej',\n    'age': 30,\n    'skills': ['C#', 'Python', 'SQL'],\n    'address': {\n        'city': 'Moskau',\n        'zip': 101000\n    }\n}";\n\ndynamic obj = JsonConvert.DeserializeObject<dynamic>(json);\n\nConsole.WriteLine(obj.name);        // Alexej\nConsole.WriteLine(obj.age);         // 30\nConsole.WriteLine(obj.skills[0]);   // C#\nConsole.WriteLine(obj.address.city); // Moskau\n
\n\n

Alles einfach und elegant. Aber es gibt einen Haken: Bei der Arbeit mit dynamic verlieren Sie IntelliSense und die Typprüfung zur Kompilierzeit. Ein Fehler im Feldnamen wird erst zur Laufzeit sichtbar. Daher:

\n\n
    \n
  • Verwenden Sie dynamic nur zum Lesen von Daten, die Sie nicht kontrollieren.
  • \n
  • Umwickeln Sie Aufrufe unbedingt mit try-catch.
  • \n
  • Übertreiben Sie es nicht – wenn die JSON-Struktur stabil ist, erstellen Sie besser eine DTO-Klasse.
  • \n
\n\n

Methode 2: Modern – System.Text.Json

\n\n

Seit .NET Core 3.0 fördert Microsoft System.Text.Json – schnell, nativ, ohne externe Abhängigkeiten. Im Jahr 2025 ist es der Standard für neue Projekte.

\n\n

Aber es gibt einen Haken: System.Text.Json kann nicht „out of the box“ in dynamic deserialisieren. Man muss ein wenig tricksen.

\n\n

Variante A: Über JsonDocument und ExpandoObject

\n\n
using System.Text.Json;\nusing System.Dynamic;\n\nstring json = @"{""name"":""Elena"",""age"":25,""active"":true}";\n\nusing JsonDocument doc = JsonDocument.Parse(json);\ndynamic obj = ConvertToExpando(doc.RootElement);\n\nConsole.WriteLine(obj.name);   // Elena\nConsole.WriteLine(obj.age);    // 25\nConsole.WriteLine(obj.active); // True\n\nstatic ExpandoObject ConvertToExpando(JsonElement element)\n{\n    var expando = new ExpandoObject();\n    var dict = (IDictionary<string, object>)expando;\n\n    foreach (var property in element.Enumera                

Blogs

Buchempfehlungen