Desarrollo iOS: Obtener datos de un fichero JSON
En este artículo vamos a ver como hacer uso de una API pública basada en el formato JSON para incorporar información a nuestra aplicación.
En este ejemplo, utilizaremos un servicio gratuito que nos provee la web punchfork.com en la siguiente url:
JSON es un formato ligero para intercambiar información, similiar a XML pero con una considerable reducción en cuanto al tamaño de los archivos.
A continuación vamos a ver dos ejemplos en XML y JSON para que podáis apreciar la diferencia:
XML
<recetas> <receta> <nombre>Huevos fritos</nombre> <puntuacion>5</puntuacion> <ingredientes>Huevos, aceite, sal</ingredientes> <fecha>20/12/2011</fecha> </receta> </recetas>
JSON
“recetas”: [
{
“nombre” : “Huevos fritos”
“puntuación”: 5
“ingredientes”: “Huevos, aceite, sal”
“fecha”: “20/12/2011”
}
Como se puede observar en este ejemplo, el tamaño en el archivo JSON es notablemente inferior. Quizás esto pueda ser un matiz sin importante para este ejemplo, pero imaginemos que tenemos que descargar de internet 20.000 recetas. ¿No será mejor descargar 800 kb que 2,5 mb?
Podéis consultar más información sobre JSON en:
http://es.wikipedia.org/wiki/JSON
Pues bien, como comentábamos antes, para este ejemplo deberemos inscribirnos en la web PunchFork para obtener gratuitamente una API KEY que podamos utilizar para este ejemplo. La API KEY ofrecida gratuitamente por esta empresa, esta limitada a un total de 500 peticiones al día. Si queréis utilizar esta API de forma comercial sin límite, podéis consultar los plantes de precios en la propia web.
El código que aquí os facilito es útil tanto si utilizáis PunchFork, como para cualquier otra fuente de datos JSON.
En nuestro ejemplo, para el parseo o lectura del fichero JSON utilizaremos una librería OpenSource que podéis descargar desde aqui.
Incluir la librería de JSON en nuestro proyecto
En primer lugar deberemos incluir en nuestro proyecto la librería de JSON, y que esta formada por dos directorios:
• JSON
• JSON-URL
Para ello, haremos clic con el botón secundario en nuestro proyecto y pulsaremos la opción “Add Files to XXXXXX”. Seleccionaremos los dos directorio indicados anteriormente y pulsaremos el botón “Add”. (Para facilitar la posterior distribución de vuestra App, recordar seleccionar la opción “Copy ítems to destination group si tenéis esta librería en un directorio distinto a vuestro proyecto).
Creación de una clase Receta
Para poder obtener y recorrer la información obtenida de JSON, necesitaremos una clase especifica que albergue la información de cada receta.
Crearemos una nueva clase mediante el botón secundario en nuestro proyecto “New file…”.
La nueva clase deberá ser un Objective-C class, y su clase padre deberá ser NSObject.
Para el ejemplo la llamaremos “Receta”.
Receta.h
#import @interface Receta : NSObject @property (nonatomic, retain) NSString *nombre; @property (nonatomic, retain) NSString *imagen; @property (nonatomic) int contadorTwitter; @end
Receta.m
#import "Receta.h" @implementation Receta @synthesize nombre, imagen, contadorTwitter; @end
Creamos un método que recupere la lista de recetas del servicio
En primer lugar importaremos la librería en la cabecera de nuestro ViewController:
#import “myJson.h”
A continuación creamos el método:
// Método que obtiene la lista de recetas de la API de PunchFork
-(void) cargarRecetas {
NSString *url =
@"http://api.punchfork.com/recipes?key=VUESTRA_API_KEY&q=";
Json *jsonParser = [[Json alloc] init];
[jsonParser startLoadingObjectWithUrl:url andDelegate:self];
}
// Método que es llamado una vez se ha descargado el fichero JSON (delegado)
-(void)dataRequestCompletedWithJsonObject:(id)jsonObject {
NSDictionary *recetasDictionary = (NSDictionary *)jsonObject;
NSArray *recetasArray = (NSArray *)[recetasDictionary objectForKey:@"recipes"];
for (NSDictionary * dic in recetasArray) {
Receta *receta = [[Receta alloc] init];
[receta setNombre:[dic objectForKey:@"title"]];
[receta setImagen:[dic objectForKey:@"thumb"]];
[receta setContadorTwitter:[[dic objectForKey:@"twc"] intValue]];
NSLog(receta.nombre);
}
}
Como véis, la librería que estamos utilizando requiere que nuestro ViewController implemente un Delegate denominado “myJsonDelegate”.
De este modo, una vez se descargue correctamente el fichero JSON de internet, el segundo método será llamado automáticamente.
Recordar que para declarar nuestro ViewController como delegado de la clase, es necesario incluir el siguiente código en la definición de la cabecera de nuestra clase:
@interface XXXXXX : UIViewController
En el ejemplo mostrado anteriormente, se describe como obtener diferentes tipos de atributos de la receta como son NSString o Integer.
Si ejecutáis el Simulador con el código aquí indicado podréis comprobar que en la Consola de vuestro Xcode se pinta algo similar a esto:
Baked Potato Soup
Parmesan Roasted Potatoes
Bacon & Cheese Wrapped Tater Tots with Tabasco
…
El parseo del fichero JSON dependerá de la propia estructura del fichero y por tanto, la información aquí recogida solo aplica a nuestro ejemplo.
Espero que os haya resultado interesante el artículo y que le hayáis perdido el miedo por completo al parseo de ficheros JSON.
Podéis descargar todo el código fuente (sin el API KEY) de este artículo desde aquí.

Ese assign en los NSString me parece un poco raro, ¿no?
Le resultó de ayuda?
Me gustaNo me gustaAntonio, mas razón que un santo!!! Ya lo he modificado!! He sido víctima de mi propia medicina! Copiar + Pegar!
Le resultó de ayuda?
Me gustaNo me gustaGracias!!!!
Le resultó de ayuda?
Me gustaNo me gustaUna pregunta, porqué usas una librería externa para JSON si iOS 5 ya trae una integrada?? Da problemas la de Apple??
Le resultó de ayuda?
Me gustaNo me gustaHola José Manuel,
La verdad es que tienes toda la razón, y cuando escribí el artículo sinceramente no tenía conocimiento de ello (que iOS 5 incorporaba esta funcionalidad). Pocos días despues de publicarlo recibí un DM de un compañero por Twitter justo comentando esto mismo.
Estoy ya preparando un artículo para hacer el mismo ejemplo pero sin utilizar librerías de terceros. El problema es que quería lanzar el artículo de ayer de Storyboarding que tenía ya congelado desde hacía semanas, y lo priorice.
Gracias igualmente por tu comentario, que tiene todo el sentido del mundo.
Un abrazo.
Le resultó de ayuda?
Me gustaNo me gusta