JSON verarbeiten in Windows Phone 7-App

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
  }
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.