Vorgehensweise: Serialisieren und Deserialisieren von JSON-Daten

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

In diesem Thema veranschaulicht, wie .NET Textobjekte in JSON-codierte Daten serialisieren und Deserialisieren von Daten im JSON-Format anschließend wieder in Instanzen von .NET-Typen mithilfe der DataContractJsonSerializer. Dieses Beispiel verwendet einen Datenvertrag, um die Serialisierung und die Deserialisierung eines benutzerdefinierten Person-Typs zu veranschaulichen.

In der Regel wird die JSON-Serialisierung und -Deserialisierung automatisch von Windows Communication Foundation (WCF) vorgenommen, wenn Sie Datenvertragstypen in Dienstvorgängen verwenden, die über AJAX-aktivierte Endpunkte verfügbar gemacht werden. In manchen Fällen müssen Sie möglicherweise direkt mit JSON-Daten arbeiten. Dieses Szenario wird in diesem Thema veranschaulicht.

Hinweis

Wenn bei der Serialisierung einer ausgehenden Antwort auf dem Server ein Fehler auftritt oder wenn der Antwortvorgang aus einem anderen Grund eine Ausnahme auslöst, wird möglicherweise kein Fehler an den Client zurückgegeben.

Dieses Thema basiert auf den JSON-Serialisierung Beispiel.

So definieren Sie den Datenvertrag für eine Person

  1. Definiert den Datenvertrag für Person durch Anfügen der DataContractAttribute zur Klasse und DataMemberAttribute Attribut auf die Member serialisiert werden sollen. Weitere Informationen finden Sie unterzu 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

  1. Erstellen Sie eine Instanz des Person-Typs.

    Person p = new Person();  
    p.name = "John";  
    p.age = 42;  
    
  2. Serialisieren der Person Objekt in einen Speicher-Stream mit der DataContractJsonSerializer.

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

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

    stream1.Position = 0;  
    StreamReader 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. Deserialisiert die JSON-codierte Daten in eine neue Instanz der Person mithilfe der ReadObject Methode der DataContractJsonSerializer.

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

    Console.Write("Deserialized back, got name=");  
    Console.Write(p2.name);  
    Console.Write(", age=");  
    Console.WriteLine(p2.age);  
    

Beispiel

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

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

    // Serializer the User object to the stream.  
    DataContractJsonSerializer 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)  
{  
    User deserializedUser = new User();  
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));  
    DataContractJsonSerializer 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;  
}  

Siehe auch

Eigenständige JSON-Serialisierung
Unterstützung für JSON und andere Datenübertragungsformate