Wie analysiere ich JSON mit Objective-C?

114

Ich bin neu im iPhone. Kann mir jemand die Schritte erklären, die zu befolgen sind, um diese Daten zu analysieren und die Aktivitätsdetails, den Vor- und Nachnamen abzurufen?

{
    "#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
quelle
1
Stellen Sie sicher, dass Sie eine Antwort als akzeptiert markieren, wenn sie Ihrer Sache geholfen hat.
Radu Florescu

Antworten:

174

Mit Blick auf die Starts von OS X 10.7 und iOS 5 ist der von NSJSONSerializationApple bereitgestellte JSON-Parser wahrscheinlich das erste, was jetzt empfohlen wird . Verwenden Sie Optionen von Drittanbietern nur als Fallback, wenn Sie feststellen, dass diese Klasse zur Laufzeit nicht verfügbar ist.

Also zum Beispiel:

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
quelle
1
Gibt es ein Beispiel dafür, wie das funktioniert? Ich finde, dass die Apple-Dokumentation fehlt.
Robert Karl
@ RobertKarl Ich habe meine Antwort aktualisiert. hoffentlich klärt das die dinge?
Tommy
Ja! Danke, das ist hilfreich. Insbesondere, was für Optionen und den Fehlerparameter übergeben werden soll, ist ohne ein funktionierendes Beispiel etwas mystisch (ich habe keines in der Dokumentation gefunden). Warum der Entwickler einen Verweis auf den Fehlerzeiger übergibt, bleibt mir rätselhaft.
Robert Karl
1
@RobertKarl Es ist nur eine einfache Möglichkeit, eine Methode zu haben, die zwei Dinge anstelle von einem zurückgibt. Dies bedeutet normalerweise auch, dass die zweite Option optional ist. Bei den meisten Methoden mit diesem Muster ist die Angabe von Null gültig und führt einfach dazu, dass Sie diese Informationen nicht erhalten.
Tommy
Ja, ich bin so glücklich, dass Apple endlich hinzugefügt hat NSJSONSerialization. Ich benutze dies jetzt anstelle von json-framework.
Alex
23

Das Rad nicht neu erfinden. Verwenden Sie json-framework oder ähnliches.

Wenn Sie sich für die Verwendung von json-framework entscheiden, analysieren Sie eine JSON-Zeichenfolge folgendermaßen 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
quelle
3
Für "etwas Ähnliches" listet json.org fünf JSON-Parser für Objective-C auf.
4
Beachten Sie, dass es sich bei der Lizenz nicht um eine Standard-Open Source-Lizenz handelt. Möglicherweise müssen Sie es überprüfen, bevor Sie die Bibliothek verwenden können.
Ravindranath Akila
2
Bietet die Verwendung wirklich einen Vorteil gegenüber NSJSONSerialization?
Kiran
Warum Build-Fehler: Keine sichtbare @ Schnittstelle für 'SBJson4Parser' deklariert den Selektor 'objectWithString:'
Gank
7
Dies ist wirklich einer der schlechtesten Ratschläge. Es ist wichtig zu lernen und zu verstehen, wie Dinge funktionieren, anstatt jedes Mal, wenn Sie auf etwas Komplexes stoßen, ein Framework zu verwenden, da dies nicht lehrt. Frameworks von Drittanbietern sind ebenfalls keine Silberkugeln und können mit Fehlern, Ineffizienzen oder einfach nur zum Kotzen durchsetzt sein. Zu sagen, dass Sie ein Framework verwenden sollten und sich darüber keine Sorgen machen sollten, ist der schlechteste Rat, den Sie geben sollten, da Sie wirklich sagen: "Lernen Sie nicht, verwenden Sie einfach ein Framework und sparen Sie Zeit".
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"]);

}

Datei:

 [
  {
  "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
quelle
12

JSON-Analyse mit 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"]]);
            }
            
          }

     }

Sie können die Konsolenausgabe wie folgt sehen:

Vorname - Nachname: Chandra Bhusan - Pandey

Vorname - Nachname: Kalaiyarasan - Balu

Vorname - Nachname: (null) - (null)

Vorname - Nachname: Girija - S.

Vorname - Nachname: Girija - S.

Vorname - Nachname: (null) - (null)

Soumya
quelle
6
  1. Ich empfehle und verwende TouchJSON zum Parsen von JSON.
  2. Um deinen Kommentar an Alex zu beantworten. Hier ist ein schneller Code, mit dem Sie die Felder wie activity_details, last_name usw. aus dem zurückgegebenen json-Wörterbuch abrufen können:

    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
quelle