Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
Persondoor 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
Persontype.var p = new Person(); p.name = "John"; p.age = 42;Serialiseer het
Personobject 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
Personde 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;
}