/// <summary> /// Extrae un personaje de la fuente de datos en JSON. /// </summary> /// <param name="name"> /// El nombre del pesonaje a extraer de la fuente de datos. /// </param> /// <returns> /// Un objeto Character cuyo nombre coincide con el solicitado. /// </returns> /// <pre>true</pre> /// <post>(this.Contains(name) => (returnValue != null) && (returnValue.Name.Equals(name)))</post> public FullCharacter GetCharacterFromSource(string name) { FullCharacter character = null; // Obtenemos un lector de tokens de Json. Para ello creamos primero un stream de la // cadena json, luego creamos un lector de texto usando ese stream y por último creamos // un lector de tokens utilizando el lector de texto y lo inicializamos JsonReader reader = new JsonTextReader(new StringReader(jsonString)); JTokenReader tokenreader = new JTokenReader(JToken.ReadFrom(reader)); tokenreader.Read(); // Obtenemos el token cuyo nombre corresponde al deseado, utilizando para ello una // expresión JSonPath // Para más información sobre JPath: http://goessner.net/articles/JsonPath/ JToken token = tokenreader.CurrentToken.SelectToken("$.[?(@.name=='" + name + "')]", false); // Si existe un token con dihco nombre, existe el personaje buscado if (token != null) { // Creamos un nuevo objeto de tipo Character e incrementamos el correspondiente // contador character = new FullCharacter(); createdCharacters++; // Extraemos el valor de la Propiedad Nombre del correspondiente token character.Name = token.SelectToken("name").Value<String>(); // Extraemos el valor de la Propiedad Nombre del correspondiente token character.Description = token.SelectToken("description").Value<String>(); IEnumerable<JToken> relatedCharactersTokens = token.SelectToken("related_characters").Values<JToken>(); // Construimos la colección de personajes relacionados con la colección de tokens JSON FillRelatedCharacters(character, relatedCharactersTokens); } // if // Cerramos los lectores que estén abiertos tokenreader.Close(); reader.Close(); return character; }
private void createCharacter() { character = (FullCharacter) dataSource.GetCharacter(name); }
/// <summary> /// Crea la colección de personajes relacionados para el personaje que se pasa como parámetro, /// utilizando para ello la colección de tokens con nombres de personajes que se pasa como /// parámetro /// </summary> /// <param name="character"> /// El objeto Character al que se le deben añadir los personajes relacionados /// </param> /// <param name="relatedCharacterTokens"> /// El conjunto de tokens Json que representan nombres de personajes relacionados /// </param> /// <pre>(character != null) && (relatedCharacterTokens != null)</pre> /// <post></post> private void FillRelatedCharacters(FullCharacter character, IEnumerable<JToken> relatedCharacterTokens) { // Procesamos cada token dentro de la colección // Se puede hacer con foreach por es un IEnumerable foreach (JToken token in relatedCharacterTokens) { // Extraemos el nombre del personaje relacionado que estamos procesando string relatedName = token.SelectToken("name").Value<String>(); // Obtenemos el objeto personaje utilizando esta misma capa de acceso a datos // El personaje vendrá del pool, si haya había sido creado, o de la fuente de datos, // si no hubiese sido creado antes. Character relatedCharacter = new CharacterProxy(dataSource); relatedCharacter.Name = relatedName; // Añadimos el personaje relacionado a la colección de personajes relacionados del // objeto personaje recibido como parámetro character.RelatedCharacters.Add(relatedCharacter); } // foreach }