Lo siguiente fue tomado directamente del Tutorial de Dan Grigsby en - http://mobileorchard.com/tutorial-json-over-http-on-the-iphone/ - Por favor, atribuir, robar es un mal karma.
Fetching JSON a través de HTTP
Usaremos NSURLConnection de cacao para emitir una solicitud HTTP y recuperar los datos JSON.
Cocoa proporciona opciones síncronas y asíncronas para realizar solicitudes HTTP. Las solicitudes sincrónicas que se ejecutan desde el runloop principal de la aplicación hacen que la aplicación se detenga mientras espera una respuesta. Las solicitudes asincrónicas utilizan devoluciones de llamada para evitar el bloqueo y son fáciles de usar. Usaremos solicitudes asincrónicas.
Lo primero que debemos hacer es actualizar la interfaz de nuestra controladora de vistas para incluir un NSMutableData que contenga los datos de respuesta. Declaramos esto en la interfaz (y no dentro de un método) porque la respuesta regresa en serie en piezas que unimos en lugar de en una unidad completa.
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
IBOutlet UILabel *label;
NSMutableData *responseData;
}
Para simplificar, iniciaremos la solicitud HTTP de viewDidLoad.
sustituir el contenido de:
#import "JSON/JSON.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
responseData = [[NSMutableData data] retain];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"XYZ.json"]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[responseData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
label.text = [NSString stringWithFormat:@"Connection failed: %@", [error description]];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
}
- (void)dealloc {
[super dealloc];
}
@end
Este código principalmente repetitivo inicializa la variable ResponseData para estar listo para contener los datos y se inicia la conexión en viewDidLoad; reúne las piezas a medida que entran en didReceiveData; y la conexión vacíaDidFinishLoading está lista para hacer algo con los resultados. Usando los datos JSON
A continuación, desarrollaremos el método connectionDidFinishLoading para hacer uso de los datos JSON recuperados en el último paso.
el método de actualización de connectionDidFinishLoading:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];
NSArray *luckyNumbers = [responseString JSONValue];
NSMutableString *text = [NSMutableString stringWithString:@"Lucky numbers:\n"];
for (int i = 0; i < [luckyNumbers count]; i++)
[text appendFormat:@"%@\n", [luckyNumbers objectAtIndex:i]];
label.text = text;
}
Se crea una NSArray. El analizador sintáctico es muy flexible y devuelve objetos, incluidos objetos anidados, que combinan adecuadamente los tipos de datos JSON con los tipos de datos Objective-C. Mejor manejo de errores
Hasta ahora, hemos estado utilizando las convenientes extensiones de alto nivel del método NSString para analizar JSON. Lo hemos hecho con una buena razón: es útil simplemente enviar el mensaje JSONValue a una cadena para acceder a los valores JSON analizados.
Desafortunadamente, el uso de este método dificulta el manejo de errores. Si el analizador JSON falla por algún motivo, simplemente devuelve un valor nulo. Sin embargo, si ve el registro de su consola cuando esto sucede, verá mensajes que describen con precisión qué causó el error del analizador.
Sería bueno poder pasar los detalles del error junto con el usuario. Para hacerlo, cambiaremos al segundo método orientado a objetos compatible con JSON SDK.
el método de actualización en connectionDidFinishLoading:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];
NSError *error;
SBJSON *json = [[SBJSON new] autorelease];
NSArray *luckyNumbers = [json objectWithString:responseString error:&error];
[responseString release];
if (luckyNumbers == nil)
label.text = [NSString stringWithFormat:@"JSON parsing failed: %@", [error localizedDescription]];
else {
NSMutableString *text = [NSMutableString stringWithString:@"Lucky numbers:\n"];
for (int i = 0; i < [luckyNumbers count]; i++)
[text appendFormat:@"%@\n", [viewcontroller objectAtIndex:i]];
label.text = text;
}
}
uso de este método nos da un puntero al objeto de error del analizador JSON subyacente que podemos utilizar para el tratamiento de errores más útil.
Conclusión:
El SDK JSON y Cacao de soporte incorporado para el maquillaje HTTP añadiendo servicios web JSON para iPhone Apps sencillo.
Solución 1 funcionó. Esencialmente, necesitaba atravesar el nodo JSONRESPONSE para poder acceder al elemento deseado. ¡Gracias! – mibrop