Procedimiento para usar DataContractJsonSerializer

Nota

Este artículo trata sobre DataContractJsonSerializer. Para la mayoría de los escenarios que implican la serialización y deserialización JSON, se recomiendan las API del Espacio de nombres System.Text.Json.

JSON (notación de objetos JavaScript) es un formato de codificación de datos eficaz que permite intercambios rápidos de cantidades pequeñas de datos entre los exploradores de cliente y servicios web con AJAX (JavaScript asincrónico y XML) habilitado.

Este artículo muestra cómo serializar objetos de tipo .NET en datos codificados mediante JSON y, a continuación, deserializar de nuevo dichos datos en formato JSON en instancias de tipos .NET. En este ejemplo, se usa un contrato de datos para mostrar la serialización y deserialización de un tipo Person que define el usuario y usa DataContractJsonSerializer.

Normalmente, Windows Communication Foundation (WCF) controla la serialización y deserialización JSON de forma automática cuando usa tipos de contratos de datos en operaciones de servicio que se exponen a través de puntos de conexión habilitados para AJAX. Sin embargo, en algunos casos es posible que necesite trabajar con datos JSON directamente.

Este artículo se basa en el ejemplo de DataContractJsonSerializer.

Para definir el contrato de datos de un tipo Persona

  1. Defina el contrato de datos para Person adjuntando DataContractAttribute a la clase y el atributo DataMemberAttribute a los miembros que desee serializar. Para obtener más información sobre contratos de datos, consulte Diseño de contratos de datos.

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

Para serializar una instancia de tipo Persona a JSON

Nota

Si se produce un error durante la serialización de una respuesta saliente en el servidor o por algún otro motivo, es posible que no se devuelva al cliente como un error.

  1. Cree una instancia del tipo Person.

    var p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. Serialice el objeto Person a una secuencia de memoria mediante DataContractJsonSerializer.

    var stream1 = new MemoryStream();
    var ser = new DataContractJsonSerializer(typeof(Person));
    
  3. Utilice el método WriteObject para escribir datos JSON en la secuencia.

    ser.WriteObject(stream1, p);
    
  4. Muestre la salida JSON.

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

Deserialización de una instancia de tipo Persona a partir de JSON

  1. Deserialice los datos codificados con JSON en una nueva instancia de Person utilizando el método ReadObject de DataContractJsonSerializer:

    stream1.Position = 0;
    var p2 = (Person)ser.ReadObject(stream1);
    
  2. Muestre los resultados.

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

Ejemplo

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

Nota

El serializador de JSON inicia una excepción de serialización para los contratos de datos que tienen varios miembros con el mismo nombre, tal y como se muestra en el siguiente código de ejemplo.

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

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

Consulte también