De jSon a objetos en C#

json160La Web es prácticamente vital en todos los desarrollos actuales. Y no por que todos los desarrollos se limiten a páginas o sitios Web, sino debido a que se ha transformado en una plataforma de comunicación de datos, que evolucionó desde los servicios Webs más simples hasta llegar transmitir información mucho más robusta que un simple XML plano.

Algunos de estos servicios sobre HTTP optan por transmitir datos mediante notación jSon, ya que el objetivo, sus consumidores serán, en su mayoría, páginas cargadas de llamadas asíncronas, siendo este resultado (jSon) de simple conversión a código y objetos JavaScript.

Pero nos enfrentamos a un problema cuando queremos consumir los mismos servicios desde plataformas que no son sustentadas por código JavaScript. En nuestro caso C#.

Por lo tanto, necesitamos un “deserializador” de jSon a C#, que actue como lo haría la instrucción JSON.parse de JavaScript.

.Net Framework 4 posee un conjunto de clases dentro del espacio de nombres Serialization justamente para realizar este trabajo.

using System.Runtime.Serialization.Json;

Por supuesto, será necesario realizar algo de código para poder usarlo. Supongamos, entonces, que contamos con nuestro texto plano en jSon y queremos obtener a cambio una clase con datos:

public class JSonParser
{
    public T Deserialize<T>(string json)
    {
        T concreteObject = Activator.CreateInstance<T>();
        var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(json));
        var serializer = new DataContractJsonSerializer(concreteObject.GetType());

        concreteObject = (T)serializer.ReadObject(memoryStream);
        memoryStream.Close();
        memoryStream.Dispose();
       
        return concreteObject;
    }
}

El retorno de esta función será, por lo tanto, el tipo T que concuerde con el string jSon.


5 comentarios on “De jSon a objetos en C#”

  1. erafita dice:

    Hola!

    No sé si te refieres a lo mismo, pero creo que se podría hacer con menos líneas y menos objetos instanciados, lo que no he probado cual es más óptimo.

    public T Deserialize(string json) {
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    return serializer.Deserialize(json);
    }

    Un saludo!

    • Es similar, pero de acuerdo a la documentación del MSDN, JavaScriptSerializer tiene un scope menor o acotado, principalmente enfocado en aplicaciones con soporte para AJAX.

      El caso del ejemplo te serviría para aplicaciones que no son nativas Web, por ejemplo, una aplicación Win32, Windows Phone 7, de consola, etc.

      http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

      • erafita dice:

        Genial!
        Eso es lo que buscaba, cuales podrían ser las diferencias, ventajas y desventajas.
        Muchas gracias,
        Rafa

      • No he usado directamente la que sugeriste, así que no sabría exáctamente cuales son las ventajas y desventajas.

        De cualquier manera, a priori, la ventaja del método propuesto en el post por sobre el otro sería que no requieres de referencias a ensamblados con un scope Web dentro de proyectos no Web.

        Luego habría que ir dentro del código y ver que termina llamando uno u otro método. Si JavaScriptSerializer solo encapsula bajo un nombre diferente lo anterior, sería más apropiado usar lo anterior. O en todo caso sería lo mismo🙂, solo que esas líneas las tendrías dentro de JavaScriptSerializer.

  2. JUAN MANUEL dice:

    Matias dejá de chamuyar jaja, esta mejor el método de Rafa. Gracias por el aporte. Éxitos.


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s