Als typisierte Sprache kann CSharp JSON-Daten sehr effizient in vorab definierte Klassen parsen. Doch was ist, wenn man keine Klasse definieren kann oder möchte? Dieser Beitrag zeigt, wie man in CSharp generischen JSON Code dennoch verarbeiten kann.
Generische JSON-Daten in CSharp verarbeiten
Zuerst installieren wir das NewtonSoft JSON Paket:
1 |
dotnet add package Newtonsoft.Json |
Der folgende Beispiel-Code illustriert das CSharp generic JSON Parsing und enthält alles, was Du wissen musst:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
using Newtonsoft.Json.Linq; // JSON Beispiel-Daten // string d = @" { ""name"": ""John"", ""age"": 30, ""isStudent"": true, ""courses"": [ { ""name"": ""Math"", ""grade"": 95 }, { ""name"": ""Science"", ""grade"": 88 } ] }"; // Daten in Objekt parsen JObject jsonObject = JObject.Parse(d); // Eigenschaften auslesen // string? name = (string?)jsonObject["name"]; int? age = (int?)jsonObject["age"]; bool? isStudent = (bool?)jsonObject["isStudent"]; Console.WriteLine($"{name} is {age} years old."); Console.WriteLine($"Still student: {isStudent}"); // Existenz einer Eigenschaft prüfen: // bool res = jsonObject.ContainsKey("address"); Console.WriteLine($"Data contains address: {res}"); // Über array iterieren // JArray? courses = (JArray?)jsonObject["courses"]; if (courses != null) { foreach (var jToken in courses) { var course = (JObject)jToken; string? courseName = (string?)course["name"]; int? grade = (int?)course["grade"]; Console.WriteLine($"Course: {courseName}, grade: {grade}"); } } |
Wie funktioniert das generic JSON Parsing in CSharp ?
Bitte beachte, daß beim Verarbeiten von generischem JSON-Code Null-Werte in den JSON-Daten vorhanden sein können. Daher sollte der o.g. Beispiel-Code noch um entsprechende Null-Checks oder Try-Catch Blöcke erweitert werden.
Der Einfachheit halber wurden diese weg gelassen.
Nun zum Code:
Zeile 1:
Um beliebigen JSON-Code ohne Klassen einzulesen, benötigen wir Newtonsoft.Json.Linq aus dem NewtonSoft JSON Paket.
Zeile 5 bis 17:
Hier wird eine JSON-Datenstruktur als String definiert und in jsonObject geparsed.
Zeile 21-26:
Über jsonObject können nun die einzelnen JSON-Felder ausgelesen werden. Typecasting sorgt dafür, daß diese in typisierten Variablen landen.
Natürlich können so auch Teilstrukturen einer komplexen JSON-Datenstruktur in definierte Klassen eingelesen werden. So bleibt der Schreibaufwand gering.
Zeile 30-31:
Hier siehst Du, wie man die Existenz eines JSON-Felds prüfen kann – als Alternative zu Null-Checks.
Zeile 35-45:
Dieser Teil zeigt, wie man in CSharp über verschachtelte JSON-Strukturen iterieren kann.
Die Ausgabe unseres Beispiels sieht dann so aus:
Fazit
Über Newtonsoft.Json.Linq können in CSharp generische JSON-Daten elegant in typisierte Variablen eingelesen werden. Ganz ohne Klassen oder auch mit Klassen, die nur für Teilstrukturen definiert wurden.