Пример #1
0
        /// <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;
        }
Пример #2
0
 private void createCharacter()
 {
     character = (FullCharacter) dataSource.GetCharacter(name);
 }
Пример #3
0
        /// <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
        }