Comment analyser JSON avec Objective-C?

114

Je suis nouveau sur iPhone. Quelqu'un peut-il me dire les étapes à suivre pour analyser ces données et obtenir les détails de l'activité, le prénom et le nom?

{
    "#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"
        }
    }
}
bhuvana
la source
1
Assurez-vous de marquer une réponse comme acceptée si elle a aidé votre cause.
radu florescu

Réponses:

174

Dans la perspective des lancements d'OS X v10.7 et d'iOS 5, la première chose à recommander maintenant est probablement l' NSJSONSerializationanalyseur JSON fourni par Apple. Utilisez des options tierces uniquement comme solution de secours si vous trouvez que cette classe n'est pas disponible au moment de l'exécution.

Ainsi, par exemple:

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:...
}
Tommy
la source
1
Un exemple de comment cela fonctionne que vous pouvez publier? Je trouve que la documentation Apple manque.
Robert Karl
@RobertKarl J'ai mis à jour ma réponse; j'espère que cela clarifie les choses?
Tommy
Oui! Merci, c'est utile. En particulier, ce qu'il faut passer pour les options et le paramètre d'erreur sont quelque peu mystiques sans exemple fonctionnel (je n'en ai pas trouvé dans leur documentation). Pourquoi le développeur passe une référence au pointeur d'erreur reste énigmatique pour moi.
Robert Karl
1
@RobertKarl c'est juste un moyen facile d'avoir une méthode qui renvoie deux choses au lieu d'une; cela signifie également généralement que la seconde est facultative - pour la plupart des méthodes avec ce modèle, fournir nil est valide et entraîne simplement que vous n'obtenez pas cette information.
Tommy
Ouais, je suis si heureux qu'Apple ait enfin ajouté NSJSONSerialization. Je l'utilise maintenant au lieu de json-framework.
Alex
23

Ne réinventez pas la roue. Utilisez json-framework ou quelque chose de similaire.

Si vous décidez d'utiliser json-framework, voici comment analyser une chaîne 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
Alex
la source
3
Quant à «quelque chose de similaire», json.org répertorie cinq analyseurs JSON pour Objective-C.
4
Notez que sa licence n'est pas une licence Open Source standard. Vous devrez peut-être l'examiner avant d'utiliser la bibliothèque.
Ravindranath Akila
2
Est-ce que l'utilisation de cela offre vraiment un avantage NSJSONSerialization?
Kiran
Pourquoi l'erreur de construction: Aucune @interface visible pour 'SBJson4Parser' déclare le sélecteur 'objectWithString:'
Gank
7
C'est vraiment l'un des pires conseils à donner. Il est important d'apprendre et de comprendre comment les choses fonctionnent plutôt que d'utiliser simplement un cadre à chaque fois que vous rencontrez quelque chose de complexe, car cela n'enseigne pas. Les frameworks tiers ne sont pas non plus des balles d'argent et peuvent être criblés de bugs, d'inefficacités ou tout simplement nul. Dire que vous devriez utiliser un framework et ne pas vous en soucier est le pire conseil à donner puisque ce que vous dites vraiment est "N'apprenez pas, utilisez simplement un framework et gagnez du temps".
TheM00s3
21
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"]);

}

fichier:

 [
  {
  "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":""
  }
  ]
Gank
la source
12

Analyse JSON à l'aide de 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 = [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"]]);
            }
            
          }

     }

Vous pouvez voir la sortie de la console comme ci-dessous:

Prénom - Nom: Chandra Bhusan - Pandey

Prénom - Nom: Kalaiyarasan - Balu

Prénom - Nom: (nul) - (nul)

Prénom - Nom: Girija - S

Prénom - Nom: Girija - S

Prénom - Nom: (nul) - (nul)

soumya
la source
6
  1. Je recommande et utilise TouchJSON pour analyser JSON.
  2. Pour répondre à votre commentaire à Alex. Voici un code rapide qui devrait vous permettre d'obtenir les champs comme activity_details, last_name, etc. à partir du dictionnaire json renvoyé:

    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"]);
        }
    }
ragamufin
la source