Всякий раз, когда мне нужно обработать некоторый код JSON, первое, что мне нравится делать, - это создавать класс на основе текста JSON. Так, например, если ваш JSON представляет состояние США, создайте класс «State».
Для этого можно использовать классный маленький продукт. Он называется Objectify и стоит около 15 долларов. Без сомнения, люди могут посоветовать другие бесплатные вещи, которые могут сделать что-то подобное.
Для фактического анализа Json я использую SBJson . Для Objective-C существует довольно много Json-фреймворков, поэтому определенно посмотрите, что вам нравится.
Далее, с SBJson, выполните фактический анализ:
-(NSDictionary *)parseJsonFromUrl
{
NSAssert(mUrl, @"Must set a url before invoking %@", __PRETTY_FUNCTION__);
// Create new SBJSON parser object
SBJsonParser *parser = [[SBJsonParser alloc] init];
// Prepare URL request to download JSON
NSURLRequest *request = [NSURLRequest requestWithURL:mUrl];
// Perform request and get JSON back as a NSData object
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// Get JSON as a NSString from NSData response
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
// parse the JSON response into an object
// Here we're using NSArray since we're parsing an array of JSON status objects
return [parser objectWithString:json_string error:nil];
}
Возвращает NSDictionary
. Вы знаете, что нужно просмотреть этот словарь, чтобы установить значения класса вашей модели. Вот как это сделать, одновременно загружая значения в NSMutableArray
:
-(void)downloadJsonData
{
NSDictionary *statesDict = [self parseJsonFromUrl];
NSMutableArray *statesArray = [NSMutableArray arrayWithCapacity:[statesDict count]];
for (NSDictionary *stateDict in stateDict)
{
State *aState = [[[State alloc] init] autorelease];
aState.stateId = [stateDict valueForKey:@"id"];
aState.name = [stateDict valueForKey:@"name"];
[statesArray addObject:aState];
}
}
Обратите внимание, что я использую имя свойства stateId
, а не id
, чтобы не конфликтовать с типом указателя объекта Objective-C.