Windows Phone 7 consumiendo JSON


Cuando traes datos desde un servidor web se suele realizar en 4 métodos comunes:

  • Webservice
  • XML
  • Dato “puro”
  • JSON

Probablemente el más utilizado en el último tiempo es JSON, por la facilidad con que se pueden generar las respuestas desde cualquier lenguaje (especiamente desde PHP).

Una respuesta “común” de JSON se ve algo así:

[sourcecode=”js”]

{“respuestas”:[{“nombre”:”UF”,”fecha”:”21\/03\/2012″,”valor”:”22.504,51″},{“nombre”:”Dolar”,”fecha”:”21\/03\/2012″,”valor”:”485,61″},{“nombre”:”UTM”,”fecha”:”01\/03\/2012″,”valor”:”39.412″},{“nombre”:”Euro”,”fecha”:”21\/03\/2012″,”valor”:”642,43″}]}

[/sourcecode]

 

Para leerlo en Windows Phone 7 hay varias alternativas, desde leerlo tipo “pelo en pecho” (realizando divisiones con las comas, dos puntos, etc… lo que es complicado si traes números), hasta pasar los datos como un datacontract (que queda bonito).

Para ello dentro de nuestro proyecto (o dentro del mismo archivo xaml.cs que estamos utilizando), debemos generar las clases con los mismos datos.

En el caso del json que mostré más arriba un contrato sería de la siguiente forma:

[sourcecode=”csharp”]

[DataContract()]
public class InfoEconomica
{
[DataMember(Name = “respuestas”)]
public Datos[] datos;
}
[DataContract]
public class Datos
{
[DataMember]
public string nombre { get; set; }
[DataMember]
public string fecha { get; set; }
[DataMember]
public string valor { get; set; }
}

[/sourcecode]

Ahora, para convertir nuestro JSON a “objetos” en C# primero debemos incluir a System.Runtime.Serialization.Json; dentro de nuestro código con un using:

[sourcecode=”csharp”]

using System.Runtime.Serialization.Json;

[/sourcecode]

lo siguiente es capturar este JSON desde un servidor remoto

[sourcecode=”csharp”]

public void ObtenerDatos()
{
try
{
WebClient client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
client.OpenReadAsync(new Uri(“http://bredebs.net/api/resp.json”), UriKind.Absolute);
}
catch (Exception ex)
{
MessageBox.Show(“Error:”+ex.Message, “Error”, MessageBoxButton.OK);
}
}

[/sourcecode]

Acá explicaré un poquito más.

Cuando instanciamos un WebClient debemos declararle un evento que se disparará cuando termine de capturar los datos desde el servidor. En este caso usaremos client_OpenReadCompleted, para capturarlo declaramos el método void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e).

Primero creamos una variable del tipo DataContractJsonSerializer con nombre serializer, como parámetro le pasamos la clase que definiste.

[sourcecode=”csharp”]

var serializer = new DataContractJsonSerializer(typeof(InfoEconomica));

[/sourcecode]

Luego creamos un objeto del tipo InfoEconomica (recuerda que este objeto es del tipo que tú creaste), y le asignamos el valor del “deserializado” (automáticamente tiene que “firmarte” el contrato de datos).

[sourcecode=”csharp”]

InfoEconomica ie = (InfoEconomica)serializer.ReadObject(e.Result);

[/sourcecode]

ahora ya puedes utilizar la instancia como una colección de objetos.

[sourcecode=”csharp”]
void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error == null)
{
var serializer = new DataContractJsonSerializer(typeof(InfoEconomica));
InfoEconomica ie = (InfoEconomica)serializer.ReadObject(e.Result);
for (int i = 0; i <= ie.datos.Length - 1; i++) { System.Console.WriteLine("$" + ie.datos[i].valor.ToString()+" Fecha: " + ie.datos[i].fecha.ToString() + "."); } } else { MessageBox.Show("Error en la conexión", "Error", MessageBoxButton.OK); } } [/sourcecode] Con esta base desarrollé una actualizaciones a la app Indicadores Económicos Chile que tengo en el marketplace de Windows Phone 7 🙂  

, ,

Una respuesta a “Windows Phone 7 consumiendo JSON”

  1. Hola, disculpa, cuando intento hacer el serializer.ReadObject(e.Result) me dice que e.Result no es del tipo compatible con esa funcion, porque?

Agregar un comentario

Su dirección de correo no se hará público.

This site uses Akismet to reduce spam. Learn how your comment data is processed.