2011-04-05 8 views
105

Soy nuevo en iPhone. ¿Puede alguien decirme los pasos a seguir para analizar estos datos y obtener los detalles de la actividad, el nombre y el apellido?¿Cómo analizo JSON con Objective-C?

{ 
    "#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": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-1627435117.jpg" 
     }, 
     "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": "http://184.73.155.44/hcl-meme/QA_TEST/" 
     }, 
     "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": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg" 
     }, 
     "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": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg", 
      "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": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg" 
     } 
    } 
} 
+1

Asegúrese de marcar una respuesta como aceptada si ayudó a su causa. –

Respuesta

24

No reinventar la rueda. Use json-framework o algo similar.

Si decide utilizar JSON-marco, así es como usted analizar una cadena JSON en un 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 
+3

En cuanto a 'algo similar', http://json.org enumera cinco analizadores JSON para Objective-C. –

+3

Tenga en cuenta que su 'licencia no es una licencia estándar de código abierto. Es posible que deba revisarlo antes de usar la biblioteca. –

+1

¿Usar esto realmente proporciona alguna ventaja sobre 'NSJSONSerialization'? – Kiran

6
  1. me recomiendan y utilizan TouchJSON para analizar JSON.
  2. Responde tu comentario a Alex. Aquí está el código rápida que debe permitir obtener los campos como activity_details, apellidos, etc. desde el diccionario JSON que se devuelve:

    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"]); 
        } 
    } 
    
160

Con la perspectiva de la v10.7 OS X y iOS 5 lanzamientos , probablemente, lo primero que recomiendo ahora es NSJSONSerialization, el analizador JSON suministrado por Apple. Utilice las opciones de terceros solo como una alternativa si encuentra que esa clase no está disponible en tiempo de ejecución.

Así, por ejemplo:

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:... 
} 
+0

¿Algún ejemplo de cómo funciona esto puede publicar? Estoy descubriendo que falta la documentación de Apple. –

+0

@RobertKarl He actualizado mi respuesta; espero que eso aclare las cosas? – Tommy

+0

¡Sí! Gracias, eso es útil. En particular, qué pasar para las opciones y el parámetro de error son algo místicos sin un ejemplo de trabajo (no he encontrado uno en su documentación). Por qué el desarrollador pasa una referencia al puntero de error sigue siendo enigmático para mí. –

16
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"]); 

} 

archivo:

[ 
    { 
    "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":"" 
    } 
    ] 
9

JSON análisis utilizando 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<array.count;z++){ 

       NSString *strfd = [NSString stringWithFormat:@"%d",k]; 
       NSDictionary *dicr = jsonObject[@"#data"][strfd]; 
       k=k+1; 
       // NSLog(@"dicr: %@",dicr); 
       NSLog(@"Firstname - Lastname : %@ - %@", 
        [NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_first_name"]], 
        [NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_last_name"]]); 
      } 

      } 

    } 

Se puede ver la salida de la consola de la siguiente manera:

Firstname - Lastname : Chandra Bhusan - Pandey

Firstname - Lastname : Kalaiyarasan - Balu

Firstname - Lastname : (null) - (null)

Firstname - Lastname : Girija - S

Firstname - Lastname : Girija - S

Firstname - Lastname : (null) - (null)

Cuestiones relacionadas