Vorgehensweise: Serialisieren und Deserialisieren von JSON-DatenHow to: Serialize and Deserialize JSON Data

JSON (JavaScript Object Notation) ist ein effizientes Datencodierungsformat, das einen schnellen Austausch kleiner Datenmengen zwischen Clientbrowsern und AJAX-aktivierten Webdiensten ermöglicht.JSON (JavaScript Object Notation) is an efficient data encoding format that enables fast exchanges of small amounts of data between client browsers and AJAX-enabled Web services.

In diesem Thema wird gezeigt, wie .NET-Typobjekte mit DataContractJsonSerializer in JSON-codierte Daten serialisiert und Daten im JSON-Format anschließend wieder in Instanzen von .NET-Typen deserialisiert werden.This topic demonstrates how to serialize .NET type objects into JSON-encoded data and then deserialize data in the JSON format back into instances of .NET types using the DataContractJsonSerializer. Dieses Beispiel verwendet einen Datenvertrag, um die Serialisierung und die Deserialisierung eines benutzerdefinierten Person-Typs zu veranschaulichen.This example uses a data contract to demonstrate serialization and deserialization of a user-defined Person type.

In der Regel wird die JSON-Serialisierung und -Deserialisierung automatisch von Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) vorgenommen, wenn Sie Datenvertragstypen in Dienstvorgängen verwenden, die über AJAX-aktivierte Endpunkte verfügbar gemacht werden.Normally, JSON serialization and deserialization is handled automatically by Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) when you use data contract types in service operations that are exposed over AJAX-enabled endpoints. In manchen Fällen müssen Sie möglicherweise direkt mit JSON-Daten arbeiten. Dieses Szenario wird in diesem Thema veranschaulicht.However, in some cases you may need to work with JSON data directly - this is the scenario that this topic demonstrates.

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.If an error occurs during serialization of an outgoing reply on the server or the reply operation throws an exception for some other reason, it may not get returned to the client as a fault.

In diesem Thema beruht auf dem JSON-Serialisierung Beispiel.This topic is based on the JSON Serialization sample.

So definieren Sie den Datenvertrag für eine PersonTo define the data contract for a Person

  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.Define the data contract for Person by attaching the DataContractAttribute to the class and DataMemberAttribute attribute to the members you want to serialize. Weitere Informationen finden Sie unterFor more information aboutDatenverträge, finden Sie unter Entwerfen von Dienstverträgen. data contracts, see Designing Service Contracts.

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

So serialisieren Sie eine Instanz des Person-Typs in JSONTo serialize an instance of type Person to JSON

  1. Erstellen Sie eine Instanz des Person-Typs.Create an instance of the Person type.

    Person p = new Person();  
    p.name = "John";  
    p.age = 42;  
    
  2. Serialisieren Sie das Person-Objekt mit DataContractJsonSerializer in einen Speicherstream.Serialize the Person object to a memory stream using the DataContractJsonSerializer.

    MemoryStream stream1 = new MemoryStream();  
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));  
    
  3. Verwenden Sie die WriteObject-Methode, um JSON-Daten in den Stream zu schreiben.Use the WriteObject method to write JSON data to the stream.

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

    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 JSONTo deserialize an instance of type Person from JSON

  1. Deserialisieren Sie die JSON-codierten Daten mit der Person-Methode des ReadObject in eine neue Instanz von DataContractJsonSerializer.Deserialize the JSON-encoded data into a new instance of Person by using the ReadObject method of the DataContractJsonSerializer.

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

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

BeispielExample

// 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:The JSON serializer throws a serialization exception for data contracts that have multiple members with the same name, as shown in the following sample code.

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

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

Siehe auchSee Also

Eigenständige JSON-Serialisierung.Stand-Alone JSON Serialization
Unterstützung für JSON und andere DatenübertragungsformateSupport for JSON and Other Data Transfer Formats