Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. iOS SDK
Code

Empezando con JSONModel

by
Difficulty:BeginnerLength:LongLanguages:

Spanish (Español) translation by steven (you can also view the original English article)

¿Qué es JSONModel?

La mayoría de las veces, nuestros dispositivos iOS están conectados a Internet y, naturalmente, la mayoría de las aplicaciones en nuestros dispositivos se conectan a un servidor remoto para capturar esta o aquella porción de datos de vez en cuando.

Algunas aplicaciones solo consumen un poco de datos, solo obtienen los últimos titulares cada hora aproximadamente. Otras aplicaciones interactúan mucho con un servicio backend mientras el usuario navega por las noticias de las redes sociales, lee publicaciones y carga fotos.

Los días en que cada servicio web hablaba XML se han ido. Hoy en día, la mayoría de las aplicaciones móviles se comunican con servicios web mediante JSON. Si planeas crear una aplicación móvil que se comunique con un servidor remoto, es probable que debas poder enviar y recibir JSON.

JSONModel es una biblioteca de código abierto escrita en Objective-C, que te ayuda a obtener JSON de un servidor, analizarlo e inicializar tus clases de modelo con los datos. También valida los datos JSON, las cascadas a través de modelos anidados y más.

"¡Pero espera!" puedes estar pensando: "Ya escribí una aplicación para iPhone que busca algunos archivos JSON y los muestra en la pantalla. ¡Fue bastante fácil!"

Bueno, eso es parcialmente cierto. NSJSONSerialization ha estado disponible desde iOS 5, por lo que es bastante fácil convertir una respuesta JSON en un objeto NSDictionary. Esto funciona bien para aplicaciones simples, pero créeme cuando digo que no es una buena idea para una aplicación compleja con un modelo de datos complejo. Veamos cómo JSONModel puede guardar tu tocino.

Ten en cuenta que soy el autor de JSONModel, que desarrolla y mantiene la biblioteca con la ayuda de colaboradores en GitHub. Obviamente soy parcial, pero estas son buenas noticias para ti, ya que podrás aprender de la persona que creó la biblioteca.

Características básicas

En esta sección, resaltaré brevemente y discutiré las características básicas de la biblioteca. Si estás demasiado ansioso por sumergirte en el código, salta a la siguiente sección, la aplicación Hello Chuck.

Mapeo automático de JSON a las clases modelo

Cuando observas los datos JSON que llenan tu objeto modelo, a menudo te sientes inclinado a coincidir con los nombres de las claves utilizadas en los datos JSON. Terminas escribiendo código que se ve así:

Con JSONModel, no necesitas escribir este tipo de código repetitivo. JSONModel asigna automáticamente JSON a las propiedades de la clase del modelo.

Validación de los datos

JSONModel inspecciona automáticamente las propiedades de tu clase de modelo y asegura que el JSON que se usa para inicializar un objeto de modelo coincida con la definición de la clase de modelo. En caso de que no coincida, entonces el objeto modelo no se inicializará.

Además, el modelo verifica que los datos JSON coincidan con los tipos definidos por la clase del modelo. Por ejemplo, si obtiene una matriz en lugar de una cadena, los datos JSON se consideran inválidos.

Transformación de datos

Debido a la simple especificación JSON, es fácil de usar, pero también elimina una gran cantidad de metadatos cuando se utiliza para transferir datos de un servidor a un cliente y viceversa. Un objeto JSON solo puede contener Strings, números, matrices y objetos.

En tu clase de modelo de Objective-C, generalmente tienes propiedades de varios tipos, no limitadas a cadenas (Strings) y números, que son los únicos tipos de datos compatibles con JSON. Por ejemplo, a menudo tienes una URL en un objeto JSON. Es fácil convertir una cadena en un objeto JSON en un objeto NSURL, pero la parte más molesta es que debes hacerlo tú mismo.

JSONModel te permite definir transformaciones para tipos de datos una vez y usarlas en tus modelos. Por ejemplo, si una respuesta JSON te proporciona una fecha como una marca de tiempo en la forma de un entero, entonces solo necesitas decirle a JSONModel cómo convertir el entero en un objeto NSDate una sola vez. Aprenderás más sobre las transformaciones de datos en la segunda entrega de esta serie.

Modelos anidados

La mayoría de las veces, una respuesta JSON tiene una estructura compleja. Un objeto, por ejemplo, puede contener uno o más objetos. Echa un vistazo al siguiente objeto JSON.

JSONModel te permite anidar clases de modelos también. No importa si tu modelo contiene otro modelo o una matriz de un objeto modelo, JSONModel inspecciona tus clases de modelo e inicializa automáticamente los objetos del tipo correcto. Echaremos un vistazo más de cerca a los modelos anidados un poco más tarde.

Eso es suficiente teoría por ahora. Aprendamos a usar la biblioteca JSONModel creando una aplicación simple como ejemplo.

The Hello Chuck App

Ahora que tienes una idea básica de lo que hace JSONModel, desarrollarás una aplicación simple que obtiene una fuente JSON de chistes de Chuck Norris y se los muestra al usuario uno por uno. Cuando hayas terminado, la aplicación se verá así:

Paso 1: Configuración del proyecto

Inicia Xcode 5, crea un nuevo proyecto seleccionando Nuevo > Proyecto... en el menú Archivo, y selecciona la plantilla de aplicación de vista única de la lista de plantillas de aplicaciones de iOS.

Nombra el proyecto como HelloChuck, especifica a Xcode dónde deseas guardarlo y presiona en Crear. No hay necesidad de poner el proyecto bajo control de código fuente.

A continuación, descarga la última versión de la biblioteca JSONModel desde GitHub, descomprime el archivo y ten un pico dentro.

El archivo contiene aplicaciones de demostración para iOS y OSX, pruebas unitarias y más. Solo te interesa la carpeta llamada JSONModel. Arrástralo a tu proyecto Xcode. La instalación es aún más fácil si usas CocoaPods.

Paso 2: Crear clases modelo

El feed JSON que vas a usar es bastante simple. Contiene un conjunto de bromas, cada broma tiene una identificación, la  broma como tal y, opcionalmente, un conjunto de etiquetas.

Comencemos por crear las clases modelo para que coincidan con los datos JSON. Crea una nueva clase, JokeModel, y hazla heredar de JSONModel. Agrega las propiedades id y text para que coincidan con las claves en los datos de JSON de la siguiente manera:

La biblioteca JSONModel convertirá automáticamente los números para que coincidan con el tipo de propiedad.

También debes crear una clase para los objetos de etiqueta en los datos JSON. Crea una nueva clase, TagModel, y hazla heredar JSONModel. Declara dos propiedades: id y tag de tipo NSString. La clase TagModel debería verse así:

Ten en cuenta que has establecido el tipo de id en NSString. JSONModel sabe perfectamente cómo transformar números en cadenas (Strings), manejará la transformación por ti. La idea es que sólo necesitas centrarte en los datos que necesitas en tu aplicación sin tener que preocuparte por cómo se ven los datos JSON.

Aunque la clase TagModel está lista para usar, necesitas una forma de decirle a la clase JokeModel que las etiquetas clave contienen una lista de instancias de TagModel. Esto es muy fácil de hacer con JSONModel. Agrega un nuevo protocolo vacío en TagModel.h y llámalo TagModel:

Abre JokeModel.h e importa el archivo de encabezado de la clase TagModel:

Aquí viene la magia. Declara una nueva propiedad para JokeModel como se muestra a continuación. La propiedad de las etiquetas es de tipo NSArray y se ajusta a dos protocolos.

  1. TagModel es el protocolo que declaraste hace un momento. Le dice a JokeModel que la matriz de etiquetas debe contener instancias de la clase TagModel.
  2. Al adherirse al protocolo Optional, la clase JokeModel sabe que los datos JSON no siempre contendrán una lista de etiquetas.

Este es un buen momento para enfatizar que todas las propiedades en tu clase modelo son requeridas por defecto. Si hace falta el id o el campo text en los datos JSON, la inicialización del objeto JokeModel fallará. Sin embargo, si las etiquetas están ausentes para una broma en particular, JSONModel no se quejará de ello.

Paso 3: Ver la configuración del controlador

Primero debes realizar algunos ajustes en la clase ViewController. Abre ViewController.m y, debajo de la declaración de importación existente en la parte superior, importa la clase JokeModel:

Debes agregar dos propiedades a la clase ViewController:

  • label para mostrar el texto de la broma en la pantalla.
  • jokes para almacenar la gama de chistes

También debes configurar la etiqueta para que esté lista cada vez que obtenga los datos JSON y tengas una broma lista para mostrar. Actualiza el método viewDidLoad como se muestra a continuación.

Creas una instancia de UILabel del tamaño de la pantalla del dispositivo y configuras su propiedad alpha en 0. La etiqueta se oculta hasta que la primera broma está lista para mostrarse.

En la última línea de viewDidLoad, llama a fetchJokes, en la que la aplicación recupera los datos JSON remotos y almacena su contenido en la propiedad jokes del controlador de vista. Implementarás fetchJokes en un momento.

Paso 4: Obtener JSON y crear objetos modelo

En este ejemplo, utilizarás la clase NSURLSession para recuperar los datos JSON remotos. Creas la URL para la solicitud, inicializas una tarea de datos y la envías en su camino.

dataTaskWithURL:completionHandler: crea para una instancia NSURLSessionDataTask con la URL que se le pasa. Al llamar a resume en la tarea de datos, le indicas a la instancia NSURLSession que agregue la tarea de datos a su cola.

A continuación, debes agregar el código para inicializar las instancias de JokeModel. Reemplaza //handle data here con:

arrayOfModelsFromData:error: toma un objeto NSData de una respuesta JSON y devuelve una matriz de modelos. ¿Pero qué pasa bajo el capó?

  1. [JokeModel arrayOfModelsFromData:error:] toma los datos JSON y los convierte en una matriz de objetos JSON.
  2. Luego, JokeModel recorre esos objetos y crea instancias de JokeModel a partir de cada objeto JSON.
  3. Cada instancia de JokeModel inspecciona los datos JSON que recibe e inicializa sus propiedades con los valores adecuados.
  4. Si la instancia de JokeModel encuentra contenido en la clave tags de los datos, crea una matriz de instancias de TagModel a partir del valor asociado con la clave tags.

Si solo necesitas crear una instancia de modelo, initWithData: e initWithString: son los métodos que debes usar. Veremos más de cerca estos métodos en el siguiente tutorial.

Después de inicializar el conjunto de chistes, puedes mostrar el primer chiste al usuario utilizando el siguiente fragmento de código.

Paso 5: Mostrando los chistes

Primero sacas una broma al azar de la matriz jokes y la guardas en model. Si la broma tiene etiquetas, guárdalas como una lista separada por comas en una variable llamada tags. Si la broma no tiene ninguna etiqueta, configura las etiquetas en @"no tags".

Actualiza la etiqueta para mostrar el id, el valor text y tags de la broma actual y utiliza una animación de atenuación para mostrar la broma al usuario.

Cuando se completa la animación, esperas cinco segundos antes de invocar hideJoke, que oculta la broma con otra animación de fundido. Cuando la animación se completa, llamas a showNextJoke una vez más.

Esto crea un bucle infinito, desvaneciendo chistes seleccionados al azar dentro y fuera. El efecto es bastante bueno. Pruébalo ejecutando la aplicación.

Sin embargo, existe el problema de que la impresión de la matriz de etiquetas muestra objetos de TagModel en lugar de objetos de cadena. Este comportamiento es en realidad una característica de la biblioteca JSONModel. Crea automáticamente una descripción del objeto como la que viste en la captura de pantalla anterior. Enumera las propiedades del objeto modelo y sus valores, lo que realmente ayuda con la depuración.

Paso 6: Personalizando Modelos

Para terminar este tutorial, escribirás tu primera línea de código de modelo. Los modelos que heredan de JSONModel son como cualquier otra clase de Objective-C. Esto significa que puedes anular los métodos de JSONModel y personalizar su comportamiento como desees.

Abre TagModel.m e invalida el método de descripción predeterminado:

Cuando llames a componentsJoinedBySeparator: en la matriz de etiquetas, en lugar de la descripción predeterminada de TagModel, solo obtendrás la etiqueta como texto plano.

Pruébalo ejecutando la aplicación una vez más. Deberías ver ahora que la lista de etiquetas aparece claramente en cada broma.

Conclusión

Ahora tienes un conocimiento básico de la biblioteca JSONModel. Hasta ahora, has aprendido:

  • Cómo crear una clase de modelo simple que hereda de JSONModel
  • Cómo definir propiedades requeridas y opcionales.
  • y cómo anidar clases modelo

En este breve tutorial, solo mencioné algunas de las características de la biblioteca JSONModel. En las próximas entregas de esta serie, aprenderás más sobre la transformación de datos, cómo trabajar con las API JSON remotas, y verás algunas características más avanzadas de JSONModel.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.