DataContractJsonSerializer gebruiken
Notitie
Dit artikel gaat over DataContractJsonSerializer. Voor de meeste scenario's waarbij JSON wordt geserialiseerd en gedeserialiseerd, raden we de API's aan in de naamruimte System.Text.Json.
JSON (JavaScript Object Notation) is een efficiƫnte indeling voor gegevenscodering waarmee snelle uitwisseling van kleine hoeveelheden gegevens tussen clientbrowsers en AJAX-webservices mogelijk is.
In dit artikel wordt gedemonstreerd hoe u .NET-typeobjecten serialiseert in met JSON gecodeerde gegevens en vervolgens gegevens in de JSON-indeling weer deserialiseert in exemplaren van .NET-typen. In dit voorbeeld wordt een gegevenscontract gebruikt om serialisatie en deserialisatie van een door de gebruiker gedefinieerd Person
type te demonstreren en gebruikt DataContractJsonSerializer.
Normaal gesproken worden JSON-serialisatie en deserialisatie automatisch verwerkt door WCF (Windows Communication Foundation) wanneer u gegevenscontracttypen gebruikt in servicebewerkingen die worden weergegeven via AJAX-eindpunten. In sommige gevallen moet u echter mogelijk rechtstreeks met JSON-gegevens werken.
Dit artikel is gebaseerd op het DataContractJsonSerializer-voorbeeld.
Het gegevenscontract voor een persoonstype definiƫren
Definieer het gegevenscontract voor
Person
door de DataContractAttribute klasse en DataMemberAttribute het kenmerk toe te voegen aan de leden die u wilt serialiseren. Zie Servicecontracten ontwerpen voor meer informatie over gegevenscontracten.[DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; }
Een exemplaar van het type Persoon naar JSON serialiseren
Notitie
Als er een fout optreedt tijdens het serialiseren van een uitgaand antwoord op de server of om een andere reden, wordt deze mogelijk niet als een fout geretourneerd naar de client.
Maak een exemplaar van het
Person
type.var p = new Person(); p.name = "John"; p.age = 42;
Serialiseer het
Person
object naar een geheugenstroom met behulp van de DataContractJsonSerializer.var stream1 = new MemoryStream(); var ser = new DataContractJsonSerializer(typeof(Person));
Gebruik de WriteObject methode om JSON-gegevens naar de stream te schrijven.
ser.WriteObject(stream1, p);
De JSON-uitvoer weergeven.
stream1.Position = 0; var sr = new StreamReader(stream1); Console.Write("JSON form of Person object: "); Console.WriteLine(sr.ReadToEnd());
Een exemplaar van het type Person van JSON deserialiseren
Deserialiseer de JSON-gecodeerde gegevens in een nieuw exemplaar met behulp van
Person
de ReadObject methode van de DataContractJsonSerializer.stream1.Position = 0; var p2 = (Person)ser.ReadObject(stream1);
De resultaten weergeven.
Console.WriteLine($"Deserialized back, got name={p2.name}, age={p2.age}");
Opmerking
// 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;
}
Notitie
De JSON-serializer genereert een serialisatie-uitzondering voor gegevenscontracten met meerdere leden met dezelfde naam, zoals wordt weergegeven in de volgende voorbeeldcode.
[DataContract]
public class TestDuplicateDataBase
{
[DataMember]
public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
[DataMember]
public new int field1 = 999;
}