Api de World of Warcraft, manipular un servicio Json

World of Warcraft, el exitoso mundo persistente de Blizzard, con sus más de 11 millones de jugadores, se ha convertido en el modelo a seguir para cualquier MMO.

En el artículo anterior de esta mini serie, hice un ejemplo de invocar a un servicio REST que transmite información en Json. De una forma asíncrona, en C#, construí dos métodos que me devolvían los datos de forma bruta.

Ahora voy a mostrar cómo resolví el cargar los datos en mi aplicación. Parseando la cadena Json y utilizando una librería gratuita muy útil para realizar estas operaciones de forma muy sencilla.

Creando estructuras

Quiero hacer la recuperación de un personaje del WoW y de sus estadísticas principales. Mirando la documentación de la API veo que la llamada podría ser algo tal que así,


string uri = "http://eu.battle.net/api/wow/character/los-errantes/bendemfalar?fields=stats";

Osea, me traigo del reino “Los Errantes”, el personaje “Bendemfalar” y sus estadísticas. Pero, claro, esta información me va a llegar en bruto y lo que yo quiero es guardarla para poder ser utilizada más adelante. Para lo cual me hago dos clases que van a adoptar el papel de POCO; es decir, meros repositorios de información.

    public class Personaje
{
public double lastModified { get; set; }
public String name { get; set; }
public String realm { get; set; }
public int Clase { get; set; }
public int gender { get; set; }
public int level { get; set; }
public int achievementPoints { get; set; }
}

public class Estadistica
{
public double health { get; set; }
public string powerType { get; set; }
public double power { get; set; }
public double str { get; set; }
public double agi { get; set; }
public double sta { get; set; }
public double intelecto { get; set; }
}

He modificado ambas clases para hacerlas más pequeñas y útiles para este ejemplo. Y ya tengo los objetos en donde almacenaré la información.

Pero, como soy un vago, rápidamente me doy cuenta que voy a necesitar una clase que contenga las dos anteriores para que me sea más sencillo mover la información.

    public class DatosPersonaje
{
public Personaje Personaje { get; set; }
public Estadistica Estadistica { get; set; }
}

Json.Net

Lo malo de trabajar con Json es que su manipulación es ardua. Mucho menos que si fuera xml, pero sigue siendo bastante tostón.

Por suerte en CodePlex, existe un fantástico proyecto que trata justamente de una librería de facilita en gran medida el trabajo de manipulación de este formato:

Json.Net de @JamesNK

Siguiendo los consejos del sitio CodePlex, instalo la librería, por medio de NuGet, directamente en el proyecto WP7 en donde estoy escribiendo esta práctica. Y creo una clase específica que tenga la responsabilidad de parsear la cadena de información y cargarla en la clase adecuada.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Model
{
public class GestorDeJson
{
public DatosPersonaje RecuperaDatosPersonaje(string jSonString)
{
DatosPersonaje datosPersonaje = new DatosPersonaje();
JObject jPersonaje = JObject.Parse(jSonString);

datosPersonaje.Personaje = JsonConvert.DeserializeObject(jPersonaje.ToString());
datosPersonaje.Personaje.Clase = (int)jPersonaje.SelectToken("class");

datosPersonaje.Estadistica =
JsonConvert.DeserializeObject(jPersonaje.SelectToken("stats").ToString());
datosPersonaje.Estadistica.intelecto = (int)jPersonaje.SelectToken("stats.int");

return datosPersonaje;
}
}
}

Como has visto, esta librería es una pequeña maravilla, y una auténtica joya. Voy a analizar cada fila importante para aclarar un poco más lo que he escrito.

DatosPersonaje datosPersonaje = new DatosPersonaje();
JObject jPersonaje = JObject.Parse(jSonString);

Como se puede ver, primero instancio un objeto del tipo Datos del Personaje, y justo debajo instancio un objeto JObject, que es de la librería, y le asigno el contenido de la cadena Json que he recogido en el artículo anterior, parseado.

datosPersonaje.Personaje = JsonConvert.DeserializeObject(jPersonaje.ToString());

Esta línea es magia pura. Lo que hace aquí es deserializar el objeto JObject y convertirlo en un objeto Personaje (que es uno de los dos que almaceno en DatosPersonaje). ¿Y cómo sabe Json.Net que campo va en donde? Pues comparando la clave de Json (“name:Bendemfalar”) con la propiedad de la Clase.

datosPersonaje.Personaje.Clase = (int)jPersonaje.SelectToken("class");

Esta última línea es la que he utilizado para cuando el nombre del campo Json es una palabra reservada en C#, como es el caso de Class. No puedo declarar una propiedad de Personaje como Class. Por lo cual debo coger el objeto JObject y seleccionar el campo que quiero transferir a mi clase.

Y, exactamente lo mismo hago con la información de estadísticas.

Investigar lo que ahora puedes hacer con esta información, te lo dejo a ti.

Más información | Blizzard Community Platform API Documentation, Json.net En GenbetaDev | Api de World of Warcraft, consumir un servicio Json Cómo hacer un escaner para Twitter

Portada de Genbeta