5 de junio de 2010

C#, Serializar JSON (DataContract)

Veamos un ejemplo práctico y simple de como serializar o seriar un objeto con formato JSON. Para ello definiremos una clase a la cual le crearemos una instancia y después la serializaremos.

Definir la clase a serializar

Para poder realizar la serialización JSON de cualquier clase usando DataContractJsonSerializer, esta debe cumplir las siguientes condiciones:

  • La clase debe tener definido el atributo [DataContract].
  • Cada elemento de la clase que deseemos serializar debe definir el atributo [DataMember]

[DataContract]

internal class Pais

{

  public int IdPais { get; set; }

 

  [DataMember]

  public string CodPais { get; set; }

  [DataMember]

  public string Nombre { get; set; }

}

 

Definir el Método que Serializa el objeto en JSON

Definiremos el método extensor que dado un objeto cualquiera, lo serializa en formato JSON. Es importante puntualizar que el tipo del objeto debe implementar DataContract. Veamos el código:

public static class JsonSerializer

{

  /// <summary>

  /// Método extensor para serializar JSON cualquier objeto

  /// </summary>

  public static string SerializaToJson(this object objeto)

  {

    string jsonResult = string.Empty;

    try

    {

      DataContractJsonSerializer jsonSerializer =

        new DataContractJsonSerializer(objeto.GetType());

      MemoryStream ms = new MemoryStream();

      jsonSerializer.WriteObject(ms, objeto);

      jsonResult = Encoding.Default.GetString(ms.ToArray());

    }

    catch { throw; }

    return jsonResult;

  }

}

Y por último solo nos queda usar el método extensor recién definido, veamos un ejemplo de uso:

class Program

{

  static void Main(string[] args)

  {

    List<Pais> lstPaises = new List<Pais>() {

       new Pais() { IdPais=31, Nombre = "Francia", CodPais = "FR" },

       new Pais() { IdPais=53, Nombre = "Cuba", CodPais = "CU" }};  

    string json = lstPaises.SerializaToJson();

    List<Pais> lst2 = json.DeserializarJsonTo<List<Pais>>();

  }

}

El resultado de seriar el objeto lstPaises sería:

[{"CodPais":"FR","Nombre":"Francia"},{"CodPais":"CU","Nombre":"Cuba"}]

En el código anterior vemos que hemos llamado a un método extensor que aún no hemos definido (DeserializarJsonTo), dicho método hará justo lo contrario (deserializar) a partir del string en formato JSON obtener el objeto de tipo List<Pais>. Veamos la definición del método:

public static T DeserializarJsonTo<T>(this string jsonSerializado)

{

  try

  {

    T obj = Activator.CreateInstance<T>();

    MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonSerializado));

    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());

    obj = (T)serializer.ReadObject(ms);

    ms.Close();

    ms.Dispose();

    return obj;

  }

  catch { return default(T); }

}

 

Artículos Relacionados:

3 comentarios:

  1. Nota para los que estan usando .NET 3.5:

    Localizado en la dll:
    System.ServiceModel.Web
    NameSpace:
    System.Runtime.Serialization

    ResponderEliminar
  2. Que ventajas me trae esta tecnología y en ves de que lo estas usando?? gracias.

    ResponderEliminar
  3. Que mundo más chiquito Derbis, yo buscando información sobre json y encuentro un artículo tuyo. Soy Abel y nos conocimos en Cubanacán, yo trabajaba ahí y tu estabas en un proyecto de Raúl. Saludos.

    ResponderEliminar