2014-08-27 3 views
-1

Im получить JSON, как показано ниже с помощью веб-сервисаРазбор JSON, используя цель - с

data =  { 
    following = 1; 
}; 
message = "You are now following"; 
status = 1; 

и я пытаюсь Переберите его, используя следующий код (для того, чтобы получить значение «после» ключа)

for(NSDictionary *item in datarecieved){ 
     int placeName = [item valueForKey:@"following"]; 
     NSLog(@"FOLLOWING VALUE %i", placeName); 
    } 

Но я получаю исключение - «неперехваченное исключение типа NSException»

+0

вы можете показать свой JSON? – BHASKAR

+1

Обратите внимание, что вы опустили начальные и конечные символы '{..};'. Это важно для понимания того, что у вас есть, поскольку они указывают словарь. (Аналогично, при отображении JSON вы должны обязательно включать самые внешние символы.) –

+0

И перейдите на json.org и изучите синтаксис JSON. Это займет всего 5-10 минут, и с этим гораздо легче справиться, если вы это понимаете, и пытаетесь «поваренной книги» все. –

ответ

2

Попробуй

int placeName = [datarecieved[@"data"][@"following"] intValue]; 
+1

Но для новичков лучше сделать это шаг за шагом - 'NSDictionary * dataDict = dataReceived [@" data "]; NSNumber * followNum = dataDict [@ "follow"]; int placeName = [followNum intValue]; 'Затем можно просмотреть промежуточные значения, чтобы понять, что происходит, когда это не совсем правильно. –

-1

за исключением вы, несомненно, Геттингом непризнанным селектор отправляется, например 0x123 45678 и потому, что item не поддерживает этот селектор.

Вы должны проверить, что на самом деле item в NSDictionary перед вызовом valueForKey: (вы должны использовать objectForKey: в любом случае):

for(NSDictionary *item in datarecieved){ 
    if ([item isKindOfClass:[NSDictionary class]]) { 
     int placeName = [item objectForKey:@"following"]; 
     NSLog(@"FOLLOWING VALUE %i", placeName); 
    } 
} 

(вы, вероятно, хотите break в какой-то момент, как только вы нашли то, что вы» ищем также).

+0

Спасибо, но код не выполняет блок «if», и получается, что я не получаю «следующее» значение. – Yrol

+0

Похоже, вам нужно найти словарь данных. @bhargavg фактически дает ответ, который, вероятно, будет работать лучше для вас. – trojanfoe

1

После того, как вы десериализации JSON это будет NSDictionary, так что вам не нужно использовать цикл (если вам не нужно перебрать все ключи)

В вашем случае, если вы просто хотите значение для following ключа, вы можете сделать следующее

NSNumber *following = [datarecieved valueForKeyPath:@"data.following"]; 
NSLog(@"FOLLOWING VALUE %@", following); 
5

вы должны сделать, как этот

for(NSDictionary *item in datarecieved){ 
     if([item class] == [NSDictionary class]) 
     { 
     int placeName = [item valueForKey:@"following"]; 
     NSLog(@"FOLLOWING VALUE %i", placeName); 
     } 
    } 

, потому что есть два других ключевых в ответ, и они dosen't содержат следующие ключевые

+0

Почему вы используете 'valueForKey:'? Почему вы тестируете такой класс, а не используете 'isKindOfClass'? – trojanfoe

0

Прежде всего, вам нужно правильный JSON. Посмотрите на комментарии OP, есть хороший адрес для понимания JSON.

Затем вы должны сначала проанализировать данные JSON. Предполагая, что datareceived имеет класс NSData:

NSError *error; 
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:datareceived options:nil error:&error]; 

if(error) { 
    NSLog(@"parsing error: %@", error); 
} 
else { 
    for(NSString *key in [dict allKeys]) { 
     NSLog(@"%@ = %@", key, [dict objectForKey:key]); 
    } 
}