Verwenden von DataContractJsonSerializer

Hinweis

In diesem Artikel geht es um DataContractJsonSerializer. Für die meisten Szenarien, die die Serialisierung und Deserialisierung von JSON enthalten, empfehlen wir die APIs im System.Text.Json-Namespace.

JSON (JavaScript Object Notation) ist ein effizientes Datencodierungsformat, das einen schnellen Austausch kleiner Datenmengen zwischen Clientbrowsern und AJAX-aktivierten Webdiensten ermöglicht.

Dieser Artikel zeigt, wie .NET-Typobjekte in JSON-codierte Daten serialisiert und Daten im JSON-Format anschließend wieder in Instanzen von .NET-Typen deserialisiert werden. In diesem Beispiel wird ein Datenvertrag zur Veranschaulichung der Serialisierung und Deserialisierung eines benutzerdefinierten Person-Typs und außerdem DataContractJsonSerializer verwendet.

Normalerweise wird die JSON-Serialisierung und -Deserialisierung von Windows Communication Foundation (WCF) automatisch durchgeführt, wenn Sie Datenvertragstypen in Dienstvorgängen verwenden, die über AJAX-aktivierte Endpunkte verfügbar gemacht werden. In einigen Fällen müssen Sie jedoch möglicherweise direkt mit JSON-Daten arbeiten.

Dieser Artikel basiert auf dem Beispiel zu DataContractJsonSerializer.

So definieren Sie den Datenvertrag für einen „Person“-Typ

  1. Definieren Sie den Datenvertrag für Person, indem Sie das DataContractAttribute an die Klasse und das DataMemberAttribute-Attribut an die zu serialisierenden Member anhängen. Weitere Informationen zu Datenverträgen finden Sie unter Entwerfen von Dienstverträgen.

    [DataContract]
    internal class Person
    {
        [DataMember]
        internal string name;
    
        [DataMember]
        internal int age;
    }
    

So serialisieren Sie eine Instanz des Person-Typs in JSON

Hinweis

Wenn bei der Serialisierung einer ausgehenden Antwort auf dem Server oder aus irgendeinem anderen Grund ein Fehler auftritt, wird er möglicherweise nicht als Fehler an den Client zurückgegeben.

  1. Erstellen Sie eine Instanz des Person-Typs.

    var p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. Serialisieren Sie das Person-Objekt mithilfe des DataContractJsonSerializer in einen Speicherdatenstrom.

    var stream1 = new MemoryStream();
    var ser = new DataContractJsonSerializer(typeof(Person));
    
  3. Verwenden Sie die WriteObject-Methode, um JSON-Daten in den Stream zu schreiben.

    ser.WriteObject(stream1, p);
    
  4. Zeigen Sie die JSON-Ausgabe an.

    stream1.Position = 0;
    var sr = new StreamReader(stream1);
    Console.Write("JSON form of Person object: ");
    Console.WriteLine(sr.ReadToEnd());
    

So deserialisieren Sie eine Instanz des Person-Typs von JSON

  1. Deserialisieren Sie die JSON-codierten Daten mit der Person-Methode des ReadObject in eine neue Instanz von DataContractJsonSerializer.

    stream1.Position = 0;
    var p2 = (Person)ser.ReadObject(stream1);
    
  2. Zeigen Sie die Ergebnisse an.

    Console.WriteLine($"Deserialized back, got name={p2.name}, age={p2.age}");
    

Beispiel

// Create a User object and serialize it to a JSON stream.
public static string WriteFromObject()
{
    // Create User object.
    var user = new User("Bob", 42);

    // Create a stream to serialize the object to.
    var ms = new MemoryStream();

    // Serializer the User object to the stream.
    var ser = new DataContractJsonSerializer(typeof(User));
    ser.WriteObject(ms, user);
    byte[] json = ms.ToArray();
    ms.Close();
    return Encoding.UTF8.GetString(json, 0, json.Length);
}

// Deserialize a JSON stream to a User object.
public static User ReadToObject(string json)
{
    var deserializedUser = new User();
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
    var ser = new DataContractJsonSerializer(deserializedUser.GetType());
    deserializedUser = ser.ReadObject(ms) as User;
    ms.Close();
    return deserializedUser;
}

Hinweis

Wie im folgenden Beispiel gezeigt, löst der JSON-Serialisierer eine Serialisierungsausnahme für Datenverträge aus, die mehrere Member mit demselben Namen besitzen:

[DataContract]
public class TestDuplicateDataBase
{
    [DataMember]
    public int field1 = 123;
}

[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
    [DataMember]
    public new int field1 = 999;
}

Weitere Informationen