2012-06-23 2 views
0

Я создал JSON, используя PHP-скрипт. Я читаю JSON и вижу, что данные были правильно прочитаны. Однако, когда дело доходит до доступа к объектам, я получаю нераспознанный селектор, отправленный в экземпляр ...Недоступен NSDictionary

Не может показаться, почему это происходит через слишком много часов. Любая помощь будет замечательной!

Мой код выглядит следующим образом:

NSDictionary *json = [[NSDictionary alloc] init]; 
json = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error]; 

NSLog(@"raw json = %@,%@",json,error); 

NSMutableArray *name = [[NSMutableArray alloc] init]; 

[name addObjectsFromArray: [json objectForKey:@"name"]]; 

код падает при достижении последней строки выше.

Выход, как это:

raw json = (
     { 
     category = vacancies; 
     link = "http://blablabla.com"; 
     name = "name 111111"; 
     tagline = "tagline 111111"; 
    }, 
     { 
     category = vacancies; 
     link = "http://blobloblo.com"; 
     name = "name 222222222"; 
     tagline = "tagline 222222222"; 
    } 
),(null) 
2012-06-23 21:46:57.539 Wind expert[4302:15203] -[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0xdcfb970 

HELP !!!

+0

FYI, ваша первая строка кода приведет к утечке, если вы не используете ARC. В любом случае, это ненужное распределение. – gschandler

ответ

1

Проблема заключается в том, что уровень корня вашего JSON - это массив, а не словарь (обратите внимание на скобки вместо фигурной скобки в качестве первого символа в журнале). Массивы не имеют селектора objectForKey. Возможно, вы намерены сначала взять objectAtIndex: 0 или перебрать все элементы?

Как в стороне, первая строка вашего кода делает полностью запутанную инициализацию NSDictionary. Он просто перезаписывается и освобождается на следующей строке.

+0

@ H2CO3 Действительно ли это утечка памяти в проекте ARC? –

+0

Действительно, это не утечка в проекте ARC, о чем мы должны говорить в эти дни канонически. – mattjgalloway

+0

Спасибо, @mattjgalloway Я откат назад. –

2

json - это массив из того, что вы показали, а не словарь. Я могу сказать это из-за круглых скобок, окружающих весь выход журнала для json. Внутри массива есть словари, которые я могу сказать по тому, что они окружены фигурными скобками.

Итак, похоже, что вы хотите что-то вроде этого:

NSError *error = nil; 
NSArray *json = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error]; 

NSLog(@"raw json = %@,%@",json,error); 

NSMutableArray *name = [[NSMutableArray alloc] init]; 
for (NSDictionary *obj in json) { 
    [name addObject:[obj objectForKey:@"name"]]; 
} 

как в сторону вы заметите, что я удалил ненужные инициализацию json к объекту перед перезаписью в следующей строке с JSONObjectWithData:options:error:. В мире ARC это не было бы утечкой, но по-прежнему совершенно необязательно выделять объект, чтобы просто избавиться от него через мгновение. Также я добавил в строку NSError *error = nil;, так как этого не было и, очевидно, было необходимо для компиляции.

+0

Большое спасибо. Это решило проблему. –

+0

@michaelblaize рад, что он решил это для вас. Я вижу, что вы новичок, поэтому я укажу, что идея состоит в том, чтобы согласиться, нажав на галочку слева от ответа, который вы считаете правильным. – mattjgalloway

Смежные вопросы