Um Daten im JSON-Format zu lesen, muss ein sogenannter „data contract“ definiert werden, der das Mapping einer Klasse auf ein JSON-Objekt beschreibt. Sobald dieser „DataContract“ vorhanden ist, kann eine JSON-Zeichenkette mit dem DataContractJsonSerializer eingelesen- und in ein C#-Objekt umgewandelt werden.
JSON-String deserialisieren
DataContract: Person.js
[DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; } |
Auslesen der JSON-Zeichenkette
public void DeserializeData() { String jsonString = "{\"age\":26,\"name\":\"Benny\"}"; byte[] byteArray = Encoding.UTF8.GetBytes(jsonString); MemoryStream memoryStream = new MemoryStream(byteArray); DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Person)); Person person = (Person)jsonSerializer.ReadObject(memoryStream); System.Diagnostics.Debug.WriteLine(person.name); // Benny } |
Bearbeitung des Datenvertrags
Die Eigenschaften, die ein DataContract definiert, lassen sich an die Domäne anpassen und mit Regeln ausstatten:
[DataContract] internal class Person { [DataMember(Name = "surname", IsRequired = true)] internal string name; [DataMember(IsRequired = false)] internal int age; } |
public void DeserializeData() { String jsonString = "{\"surname\":\"Benny\"}"; ... } |
JSON-Array deserialisieren
Um ein JSON-Array auszulesen, ist die Definition eines Containers (in Form eines zusätzlichen DataContracts) hilfreich:
DataContracts: People & Person
[DataContract] public class People { [DataMember] public Person[] persons; } [DataContract] public class Person { [DataMember] public string name; [DataMember] public int age; } |
Auslesen des JSON-Arrays:
public void DeserializeData() { var jsonString = "{\"persons\" : [{\"age\":26,\"name\":\"Benny\"}, {\"age\":25,\"name\":\"Sarah\"}]}"; People people = DeserializeData<People>(jsonString); System.Diagnostics.Debug.WriteLine(people.persons[1].name); // Sarah } public T DeserializeData<T>(string json) { using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) { var jsonSerializer = new DataContractJsonSerializer(typeof(T)); return (T)jsonSerializer.ReadObject(ms); } } |
JSON-Datei deserialisieren
Möchte man eine JSON-Datei aus dem eigenen Projekt (der „Solution“) deserialisieren, so muss zuvor sicherstellen, dass die Dateieigenschaft „Build Action“ auf „Resource“ gesetzt ist. Anschließend kann die Datei über die relative Adresse "/SOLUTIONNAME;component/RELATIVE_PATH"
referenziert werden.
SOLUTIONNAME
muss durch den Namen des Projekts ersetzt werden und RELATIVE_PATH
durch den Pfad zur Datei (z.B. Data/persons.json). Wichtig ist, dass auch wirklich der Projektname eingesetzt wird und nicht der Assembly-Name!
Heißt das Projekt zum Beispiel „Formelsammlung-3“ und der Assembly-Name „Formelsammlung_3.xap“, so muss im URI trotzdem „Formelsammlung-3“ und nicht „Formelsammlung_3“ angegeben werden (Screenshot). Vielen Dank an Cheryl Simmons für diesen Hinweis (Loading a static XML file to your Windows Phone/Silverlight App)!
JSON-Datei: Data/persons.json
{ "persons": [ { "age": 26, "name": "Benny" }, { "age": 25, "name": "Sarah" } ] } |
Auslesen der JSON-Datei:
public void DeserializeData() { var jsonString = ""; var resource = Application.GetResourceStream(new Uri("/FormelSammlung-3;component/Data/persons.json", UriKind.Relative)); if (resource != null) { using (var reader = new StreamReader(resource.Stream)) { jsonString = reader.ReadToEnd(); } People people = DeserializeData<People>(jsonString); System.Diagnostics.Debug.WriteLine(people.persons[1].name); // Sarah } } |