Comment utiliser DataContractJsonSerializer

Notes

Cet article concerne DataContractJsonSerializer. Pour la plupart des scénarios qui impliquent la sérialisation et la désérialisation de JSON, nous vous recommandons les API dans l’espace de noms System.Text.Json.

JSON (JavaScript Object Notation) est un format d'encodage de données efficace qui permet l'échange rapide de petites quantités de données entre les navigateurs clients et les services Web compatibles AJAX.

Cet article décrit comment sérialiser des objets de type .NET dans des données encodées JSON et ensuite désérialiser les données au format JSON en instances de types .NET. Cet exemple utilise un contrat de données pour montrer la sérialisation et la désérialisation d’un type Person défini par l’utilisateur, et utilise DataContractJsonSerializer.

Normalement, la sérialisation et la désérialisation JSON sont contrôlées automatiquement par Windows Communication Foundation (WCF) lorsque vous utilisez les types de contrats de données dans les opérations de service exposées sur des points de terminaison compatibles AJAX. Toutefois, dans certains cas, vous devrez peut-être utiliser directement des données JSON.

Cet article est basé sur l’exemple DataContractJsonSerializer.

Pour définir le contrat de données pour un type de personne

  1. Définissez le contrat de données pour Person en joignant DataContractAttribute à la classe et l'attribut DataMemberAttribute aux membres que vous souhaitez sérialiser. Pour plus d’informations sur les contrats de données, consultez Conception de contrats de service.

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

Pour sérialiser une instance de type Person à JSON

Notes

Si une erreur se produit pendant la sérialisation d’une réponse sortante sur le serveur ou pour une quelconque exception, il se peut qu’elle ne soit pas retournée au client sous forme d’erreur.

  1. Créez une instance du type Person.

    var p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. Sérialisez l’objet Person à un flux de données de mémoire à l’aide de DataContractJsonSerializer.

    var stream1 = new MemoryStream();
    var ser = new DataContractJsonSerializer(typeof(Person));
    
  3. Utilisez la méthode WriteObject pour écrire les données JSON dans le flux.

    ser.WriteObject(stream1, p);
    
  4. Affichez la sortie JSON.

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

Pour désérialiser une instance de type Person depuis JSON

  1. Désérialisez les données encodées JSON dans une nouvelle instance de Person à l'aide de la méthode ReadObject de DataContractJsonSerializer.

    stream1.Position = 0;
    var p2 = (Person)ser.ReadObject(stream1);
    
  2. Affichez les résultats.

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

Exemple

// 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;
}

Notes

Le sérialiseur JSON lève une exception de sérialisation pour les contrats de données dont plusieurs membres portent le même nom, comme illustré dans l'exemple de code suivant.

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

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

Voir aussi