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:

http://punchfork.com/api

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í.