Como faço para analisar o JSON com o Objective-C?

Eu sou novo no iPhone. Alguém pode me dizer os passos a seguir para analisar esses dados e obter os detalhes da atividade, primeiro nome e sobrenome?

{ "#error": false, "#data": { "": { "activity_id": "35336", "user_id": "1", "user_first_name": "Chandra Bhusan", "user_last_name": "Pandey", "time": "1300870420", "activity_details": "Good\n", "activity_type": "status_update", "photo_url": "" }, "boolean": "1", "1": { "1": { "photo_1_id": "9755" }, "activity_id": "35294", "album_name": "Kalai_new_Gallery", "user_id": "31", "album_id": "9754", "user_first_name": "Kalaiyarasan", "user_last_name": "Balu", "0": { "photo_0_id": "9756" }, "time": "1300365758", "activity_type": "photo_upload", "photo_url": "" }, "3": { "activity_id": "35289", "user_id": "33", "user_first_name": "Girija", "user_last_name": "S", "time": "1300279636", "activity_details": "girija Again\n", "activity_type": "status_update", "photo_url": "" }, "2": { "owner_first_name": "Girija", "activity_id": "35290", "activity_details": "a:2:{s:4:\"html\";s:51:\"!user_fullname and !friend_fullname are now friends\";s:4:\"type\";s:10:\"friend_add\";}", "activity_type": "friend accept", "owner_last_name": "S", "time": "1300280400", "photo_url": "", "owner_id": "33" }, "4": { "activity_id": "35288", "user_id": "33", "user_first_name": "Girija", "user_last_name": "S", "time": "1300279530", "activity_details": "girija from mobile\n", "activity_type": "status_update", "photo_url": "" } } } 

Com a perspectiva do OS X v10.7 e do iOS 5, provavelmente a primeira coisa a recomendar agora é a NSJSONSerialization , analisador JSON fornecido pela Apple. Use opções de terceiros apenas como um fallback se você achar que a class não está disponível no tempo de execução.

Então, por exemplo:

 NSData *returnedData = ...JSON data, probably from a web request... // probably check here that returnedData isn't nil; attempting // NSJSONSerialization with nil data raises an exception, and who // knows how your third-party library intends to react? if(NSClassFromString(@"NSJSONSerialization")) { NSError *error = nil; id object = [NSJSONSerialization JSONObjectWithData:returnedData options:0 error:&error]; if(error) { /* JSON was malformed, act appropriately here */ } // the originating poster wants to deal with dictionaries; // assuming you do too then something like this is the first // validation step: if([object isKindOfClass:[NSDictionary class]]) { NSDictionary *results = object; /* proceed with results as you like; the assignment to an explicit NSDictionary * is artificial step to get compile-time checking from here on down (and better autocompletion when editing). You could have just made object an NSDictionary * in the first place but stylistically you might prefer to keep the question of type open until it's confirmed */ } else { /* there's no guarantee that the outermost object in a JSON packet will be a dictionary; if we get here then it wasn't, so 'object' shouldn't be treated as an NSDictionary; probably you need to report a suitable error condition */ } } else { // the user is using iOS 4; we'll need to use a third-party solution. // If you don't intend to support iOS 4 then get rid of this entire // conditional and just jump straight to // NSError *error = nil; // [NSJSONSerialization JSONObjectWithData:... } 

Não reinvente a roda. Use o framework json ou algo semelhante.

Se você decidir usar o json-framework, veja como você poderia analisar uma string JSON em um NSDictionary :

 SBJsonParser* parser = [[[SBJsonParser alloc] init] autorelease]; // assuming jsonString is your JSON string... NSDictionary* myDict = [parser objectWithString:jsonString]; // now you can grab data out of the dictionary using objectForKey or another dictionary method 
 NSString* path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"json"]; //将文件内容读取到字符串中,注意编码NSUTF8StringEncoding 防止乱码, NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; //将字符串写到缓冲区。 NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *jsonError; id allKeys = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONWritingPrettyPrinted error:&jsonError]; for (int i=0; i< [allKeys count]; i++) { NSDictionary *arrayResult = [allKeys objectAtIndex:i]; NSLog(@"name=%@",[arrayResult objectForKey:@"storyboardName"]); } 


  [ { "ID":1, "idSort" : 0, "deleted":0, "storyboardName" : "MLMember", "dispalyTitle" : "76.360779", "rightLevel" : "10.010490", "showTabBar" : 1, "openWeb" : 0, "webUrl":"" }, { "ID":1, "idSort" : 0, "deleted":0, "storyboardName" : "0.00", "dispalyTitle" : "76.360779", "rightLevel" : "10.010490", "showTabBar" : 1, "openWeb" : 0, "webUrl":"" } ] 

Análise JSON usando NSJSONSerialization

  NSString* path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"]; //Here you can take JSON string from your URL ,I am using json file NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *jsonError; NSArray *jsonDataArray = [[NSArray alloc]init]; jsonDataArray = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&jsonError]; NSLog(@"jsonDataArray: %@",jsonDataArray); NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&jsonError]; if(jsonObject !=nil){ // NSString *errorCode=[NSMutableString stringWithFormat:@"%@",[jsonObject objectForKey:@"response"]]; if(![[jsonObject objectForKey:@"#data"] isEqual:@""]){ NSMutableArray *array=[jsonObject objectForKey:@"#data"]; // NSLog(@"array: %@",array); NSLog(@"array: %d",array.count); int k = 0; for(int z = 0; z 

Você pode ver a saída do console como abaixo:

Nome - Apelido: Chandra Bhusan - Pandey

Nome - Sobrenome: Kalaiyarasan - Balu

Nome - Sobrenome: (null) - (null)

Nome - Apelido: Girija - S

Nome - Apelido: Girija - S

Nome - Sobrenome: (null) - (null)

  1. Eu recomendo e uso o TouchJSON para analisar JSON.
  2. Para responder seu comentário para Alex. Aqui está um código rápido que deve permitir que você obtenha os campos como activity_details, last_name, etc. do dictionary json que é retornado:

     NSDictionary *userinfo=[jsondic valueforKey:@"#data"]; NSDictionary *user; NSInteger i = 0; NSString *skey; if(userinfo != nil){ for( i = 0; i < [userinfo count]; i++ ) { if(i) skey = [NSString stringWithFormat:@"%d",i]; else skey = @""; user = [userinfo objectForKey:skey]; NSLog(@"activity_details:%@",[user objectForKey:@"activity_details"]); NSLog(@"last_name:%@",[user objectForKey:@"last_name"]); NSLog(@"first_name:%@",[user objectForKey:@"first_name"]); NSLog(@"photo_url:%@",[user objectForKey:@"photo_url"]); } }