Словарь JSON в Objective-C
Я делаю URL-запрос к API, но я не знаю, как отобразить JSON, он генерирует массив из нескольких пользователей, как это [{"user": "value"}, {"user":"value"}]
и я пытался использовать TableView, поэтому мне нужен NSDictionary, но я думаю, что лучше сделать JSON как {users: [{"user": "value"}, {"user":"value"}]}
, У меня есть этот код, чтобы сделать запрос
#import "JSONKit.h"
NSError *error = nil;
NSURLResponse *response = nil;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://localhost:3000/getusers"]];
[request setHTTPMethod:@"GET"];
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
users = [[jsonData objectFromJSONData] objectForKey:@"users"];
usersKeys = [users allKeys];
но я получаю эту ошибку
2012-09-16 18:51:11.360 просмотр таблицы [2979:c07] -[JKArray allKeys]: нераспознанный селектор отправлен в экземпляр 0x6d30180 2012-09-16 18:51:11.362 просмотр таблицы [2979: c07] * Завершение работы приложения из-за невыполнения исключение 'NSInvalidArgumentException', причина: '-[JKArray allKeys]: нераспознанный селектор отправлен на экземпляр 0x6d30180'
Я действительно не знаю, как это сделать, поэтому любая помощь полезна, спасибо
2 ответа
Вы получаете эту ошибку, потому что все, что было проанализировано "jsonData
"не обязательно то, что вы ожидали (т.е. словарь).
Возможно, вам нужна проверка ошибок в вашем коде.
Например:
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if(jsonData)
{
id objectReturnedFromJSON = [jsonData objectFromJSONData];
if(objectReturnedFromJSON)
{
if([objectReturnedFromJSON isKindOfClass:[NSDictonary class]])
{
NSDictionary * dictionaryFromJSON = (NSDictionary *)objectReturnedFromJSON;
// assuming you declared "users" & "usersKeys" in your interface,
// or somewhere else in this method
users = [dictionaryFromJSON objectForKey:@"users"];
if(users)
{
usersKeys = [users allKeys];
} else {
NSLog( @"no users in the json data");
}
} else {
NSLog( @"no dictionary from the data returned by the server... check the data to see if it's valid JSON");
}
} else {
NSLog( @"nothing valid returned from the server...");
}
} else {
NSLog( @"no data back from the server");
}
Я думал о чем-то вроде этого
NSError *error = nil;
NSURLResponse *response = nil;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://localhost:3000/getusers"]];
[request setHTTPMethod:@"GET"];
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
JSONDecoder *decoder = [[JSONDecoder alloc]
initWithParseOptions:JKParseOptionNone];
NSArray *json = [decoder objectWithData:jsonData];
NSMutableArray *objects = [[NSMutableArray alloc] init];
NSMutableArray *keys = [[NSMutableArray alloc] init];
for (NSDictionary *user in json) {
[objects addObject:[user objectForKey:@"user" ]];
[keys addObject:[user objectForKey:@"value" ]];
}
users = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
NSLog(@"users: %@", users);
usersKeys = [users allKeys];
Но это не выглядит эффективным для многих предметов или я не прав?