Следующее взято непосредственно из Учебника Дэна Григсби по адресу - http://mobileorchard.com/tutorial-json-over-http-on-the-iphone/ - Пожалуйста, объясните, воровство - это плохая карма.
Загрузка JSON через HTTP
Мы будем использовать NSURLConnection от Cocoa для выдачи HTTP-запроса и получения данных JSON.
Какао предоставляет как синхронные, так и асинхронные опции для выполнения HTTP-запросов. Синхронные запросы, запускаемые из основного цикла запуска приложения, приводят к остановке приложения в ожидании ответа. Асинхронные запросы используют обратные вызовы, чтобы избежать блокировки, и просты в использовании. Мы будем использовать асинхронные запросы.
Первое, что нам нужно сделать, это обновить интерфейс нашего контроллера представления, добавив в него NSMutableData для хранения данных ответа. Мы объявляем это в интерфейсе (а не внутри метода), потому что ответ возвращается последовательно по частям, которые мы сшиваем вместе, а не по целому блоку.
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
IBOutlet UILabel *label;
NSMutableData *responseData;
}
Для простоты мы запустим HTTP-запрос от viewDidLoad.
Заменить содержимое:
#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
Этот в основном шаблонный код инициализирует переменную responseData, чтобы быть готовой к хранению данных, и запускает соединение в viewDidload; он собирает части по мере их поступления в didReceiveData; и пустое connectionDidFinishLoading готово что-то сделать с результатами.
Использование данных JSON
Далее мы уточним метод connectionDidFinishLoading, чтобы использовать данные JSON, полученные на последнем шаге.
Обновить метод 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;
}
Создает NSArray. Синтаксический анализатор очень гибок и возвращает объекты - включая вложенные объекты - которые надлежащим образом соответствуют типам данных JSON и типам данных Objective-C.
Лучшая обработка ошибок
До настоящего времени мы использовали удобные высокоуровневые расширения метода NSString для анализа JSON. Мы сделали это по уважительной причине: удобно просто отправить сообщение JSONValue в строку для доступа к проанализированным значениям JSON.
К сожалению, использование этого метода усложняет обработку ошибок. Если анализатор JSON по какой-либо причине дает сбой, он просто возвращает нулевое значение. Однако, если вы посмотрите журнал консоли, когда это произойдет, вы увидите сообщения, в которых точно описывается причина сбоя синтаксического анализатора.
Было бы хорошо иметь возможность передавать эти подробности об ошибках пользователю. Для этого мы переключимся на второй объектно-ориентированный метод, который поддерживает JSON SDK.
Обновите метод 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;
}
}
Использование этого метода дает нам указатель на объект ошибки базового анализатора JSON, который мы можем использовать для более полезной обработки ошибок.
Вывод:
JSON SDK и встроенная поддержка HTTP для Cocoa упрощают добавление веб-служб JSON в приложения для iPhone.