Was ist JSON?
JSON ist, wie XML, ein Datenformat. Es unterscheidet sich jedoch im Aufbau und der Leserlichkeit, weshalb es bei unkomplizierteren Einsatzgebieten oft Anklang findet. Zudem hat JSON einen geringeren Overhead. Wer mehr wissen will, kann sich ja auf Wikipedia umschauen ;)
Wie funktioniert diese Methode?
In diesem Tutorial wird die Funktionsweise des DataContractJsonSerializer erklärt. Grundsätzlich besteht das Verfahren daraus, dass das JSON-Objekt 1:1 in ein .NET-Objekt übertragen wird und somit gleich einsetzbar ist. Natürlich geht das auch in die andere Richtung.
Vorbereitung
Verweis auf System.Runtime.Serialization setzen und System.Runtime.Serialization.Json importieren.
Lesen (Deserialisierung) von JSON
Zunächst mal haben wir diese Ausgabe, die wir gerne in unserem Programm verarbeiten möchten:
Der erste Schritt ist, dieses Modell auf .NET anzupassen. Hierfür empfehle ich json2csharp.com. Das konvertiert zwar zu C#, aber mit einem Konverter ist das kein Problem.
Hinweis: Klassen, die hierdurch entstehen, können mit dem DataContract-, Felder mit dem DataMember-Attribut ausgestattet werden. Dies ist für das Lesen (deserialisieren) jedoch nicht notwendig. Laut MSDN scheint dies nur für die Serialisierung notwendig zu sein. Der Komplettheit zuliebe habe ich es hier nun eingefügt. Am Ende sollten wir dann dieses Modell haben:
Falls wir vor dem Problem stehen, dass die JSON-Ausgabe unmögliche Namen hat, können wir dies mittels des DataMember-Attributes lösen. Es ermöglicht, die Eigenschaften des .NET-Objektes umzubenennen, sodass es aber immer noch als sein JSON-Äquivalent erkannt und befüllt werden kann. Nehmen wir als Beispiel das Feld "Inhaber.maennlich".
Ich denke die Verwendung sollte selbsterklärend sein.
Kommen wir zum Eigentlichen. Die Serialisierung wird über den DataContractJsonSerializer abgewickelt. Um diese Aufgabe zu erleichtern, habe ich eine Helper-Klasse geschrieben:
Der Einsatz sieht dann so aus:
Nun sollte ein Objekt erzeugt worden sein, welches der JSON-Ausgabe entspricht und über dessen Eigenschaften die einzelnen Details abrufbar sind:
gibt "Xema" zurück.
Schreiben (Serialisierung) von JSON
Wie oben bereits angesprochen, ist es für die Serialisierung notwendig, Felder mit dem DataMember-, Klassen mit dem DataContract-Attribut zu versehen.
Nehmen wir das folgende Modell als Beispiel:
Der Aufbau sollte euch von oben bereits geläufig sein. Lediglich beim DataMember-Attribut der Nummernschild-Klasse habe ich zusätzlich die Order-Eigenschaft gesetzt. Diese setzt, wie der Name schon vermuten lässt, die spätere Reihenfolge im JSON. Das habe ich nur wegen der Lesbarkeit gemacht.
Zum Schreiben von JSON ist eine weitere Funktion von nöten. Sie gibt das Objekt als JSON-formatierten String zurück:
Der Aufruf sieht dann z.B. so aus:
und ergibt
(ok, nicht formatiert ;))
Weitere Methoden
@ErfinderDesRades: hat zudem ein Demoprojekt bereitgestellt, in welchem er den DataContractJSONSerializer, den JavaScriptSerializer und den XmlSerializer gegenüberstellt. Die Projektmappe findet ihr hier.
Angehängt ist ein Beispielprojekt mit dem Inhalt dieses Tutorials.
Viel Spaß!
JSON ist, wie XML, ein Datenformat. Es unterscheidet sich jedoch im Aufbau und der Leserlichkeit, weshalb es bei unkomplizierteren Einsatzgebieten oft Anklang findet. Zudem hat JSON einen geringeren Overhead. Wer mehr wissen will, kann sich ja auf Wikipedia umschauen ;)
Wie funktioniert diese Methode?
In diesem Tutorial wird die Funktionsweise des DataContractJsonSerializer erklärt. Grundsätzlich besteht das Verfahren daraus, dass das JSON-Objekt 1:1 in ein .NET-Objekt übertragen wird und somit gleich einsetzbar ist. Natürlich geht das auch in die andere Richtung.
Vorbereitung
Verweis auf System.Runtime.Serialization setzen und System.Runtime.Serialization.Json importieren.
Lesen (Deserialisierung) von JSON
Zunächst mal haben wir diese Ausgabe, die wir gerne in unserem Programm verarbeiten möchten:
Der erste Schritt ist, dieses Modell auf .NET anzupassen. Hierfür empfehle ich json2csharp.com. Das konvertiert zwar zu C#, aber mit einem Konverter ist das kein Problem.
Hinweis: Klassen, die hierdurch entstehen, können mit dem DataContract-, Felder mit dem DataMember-Attribut ausgestattet werden. Dies ist für das Lesen (deserialisieren) jedoch nicht notwendig. Laut MSDN scheint dies nur für die Serialisierung notwendig zu sein. Der Komplettheit zuliebe habe ich es hier nun eingefügt. Am Ende sollten wir dann dieses Modell haben:
VB.NET-Quellcode
- <DataContract()>
- Public Class Inhaber
- <DataMember()>
- Public Property Name() As String
- <DataMember()>
- Public Property Vorname() As String
- <DataMember()>
- Public Property männlich() As Boolean
- <DataMember()>
- Public Property Hobbys() As List(Of String)
- <DataMember()>
- Public Property Alter() As Integer
- <DataMember()>
- Public Property Kinder() As List(Of Object)
- <DataMember()>
- Public Property Partner() As Object
- End Class
- <DataContract()>
- Public Class RootObject
- <DataMember()>
- Public Property Herausgeber() As String
- <DataMember()>
- Public Property Nummer() As String
- <DataMember()>
- Public Property Deckung() As Double
- <DataMember()>
- Public Property Waehrung() As String
- <DataMember()>
- Public Property Inhaber() As Inhaber
- End Class
Falls wir vor dem Problem stehen, dass die JSON-Ausgabe unmögliche Namen hat, können wir dies mittels des DataMember-Attributes lösen. Es ermöglicht, die Eigenschaften des .NET-Objektes umzubenennen, sodass es aber immer noch als sein JSON-Äquivalent erkannt und befüllt werden kann. Nehmen wir als Beispiel das Feld "Inhaber.maennlich".
Ich denke die Verwendung sollte selbsterklärend sein.
Kommen wir zum Eigentlichen. Die Serialisierung wird über den DataContractJsonSerializer abgewickelt. Um diese Aufgabe zu erleichtern, habe ich eine Helper-Klasse geschrieben:
VB.NET-Quellcode
- Public Class JSONHelper
- Public Shared Function FromString(Of T)(input As String) As T
- If String.IsNullOrWhiteSpace(input) Then
- Throw New ArgumentException("input")
- End If
- Dim jsonSerializer = New DataContractJsonSerializer(GetType(T))
- Using ms As New MemoryStream(Encoding.UTF8.GetBytes(input))
- Return DirectCast(jsonSerializer.ReadObject(ms), T)
- End Using
- End Function
- End Class
Der Einsatz sieht dann so aus:
Nun sollte ein Objekt erzeugt worden sein, welches der JSON-Ausgabe entspricht und über dessen Eigenschaften die einzelnen Details abrufbar sind:
gibt "Xema" zurück.
Schreiben (Serialisierung) von JSON
Wie oben bereits angesprochen, ist es für die Serialisierung notwendig, Felder mit dem DataMember-, Klassen mit dem DataContract-Attribut zu versehen.
Nehmen wir das folgende Modell als Beispiel:
VB.NET-Quellcode
- <DataContract()>
- Class Auto
- Public Sub New(ByVal marke As String, ByVal name As String, ByVal nummer As Integer, ByVal nummernschild As Nummernschild)
- Me.Marke = marke
- Me.Name = name
- Me.Nummer = nummer
- Me.Nummernschild = nummernschild
- End Sub
- <DataMember()>
- Public Property Marke() As String
- <DataMember()>
- Public Property Name() As String
- <DataMember()>
- Public Property Nummer() As Integer
- <DataMember()>
- Public Property Nummernschild() As Nummernschild
- End Class
- <DataContract()>
- Class Nummernschild
- Public Sub New(ByVal kürzel As String, ByVal kennung As String, ByVal nummer As Integer)
- Me.Kürzel = kürzel
- Me.Kennung = kennung
- Me.Nummer = nummer
- End Sub
- <DataMember(Name:="Kuerzel", Order:=1)>
- Public Property Kürzel() As String
- <DataMember(Order:=2)>
- Public Property Kennung() As String
- <DataMember(Order:=3)>
- Public Property Nummer() As Integer
- End Class
Der Aufbau sollte euch von oben bereits geläufig sein. Lediglich beim DataMember-Attribut der Nummernschild-Klasse habe ich zusätzlich die Order-Eigenschaft gesetzt. Diese setzt, wie der Name schon vermuten lässt, die spätere Reihenfolge im JSON. Das habe ich nur wegen der Lesbarkeit gemacht.
Zum Schreiben von JSON ist eine weitere Funktion von nöten. Sie gibt das Objekt als JSON-formatierten String zurück:
VB.NET-Quellcode
- Public Class JSONHelper
- ...
- Public Shared Function ToJSONString(Of T)(input As Object) As String
- If input Is Nothing Then
- Throw New ArgumentException("input")
- End If
- Using ms As New MemoryStream()
- Dim ser As New DataContractJsonSerializer(GetType(T))
- ser.WriteObject(ms, input)
- ms.Position = 0
- Using sr As New StreamReader(ms)
- Return sr.ReadToEnd()
- End Using
- End Using
- End Function
- End Class
Der Aufruf sieht dann z.B. so aus:
und ergibt
(ok, nicht formatiert ;))
Weitere Methoden
- JavaScriptSerializer aus System.Web.Extensions, eher für weborientierteren Einsatz, siehe Diskussion ab hier.
- JSON.NET, eine externe Library.
@ErfinderDesRades: hat zudem ein Demoprojekt bereitgestellt, in welchem er den DataContractJSONSerializer, den JavaScriptSerializer und den XmlSerializer gegenüberstellt. Die Projektmappe findet ihr hier.
Angehängt ist ein Beispielprojekt mit dem Inhalt dieses Tutorials.
Viel Spaß!
„Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“
-Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
-Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
Dieser Beitrag wurde bereits 14 mal editiert, zuletzt von „Lukas“ ()