2010-03-10 34 views
6

Ich habe die folgende JSON-Objekt:Parsing verschachtelte JSON-Objekte mit JSON-Framework für Objective-C

{ 
"response": { 
    "status": 200 
}, 
"messages": [ 
    { 
     "message": { 
      "user": "value" 
      "pass": "value", 
      "url": "value" 
     } 
] 
    } 

}

Ich bin mit JSON-Framework (auch versucht, JSON Touch) durch diese zu analysieren und Erstelle ein Wörterbuch. Ich möchte auf den Block "message" zugreifen und die Werte "user", "pass" und "url" herausziehen.

In Obj-C Ich habe den folgenden Code:

// Create new SBJSON parser object 
SBJSON *parser = [[SBJSON alloc] init]; 

// Prepare URL request to download statuses from Twitter 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:myURL]]; 

// Perform request and get JSON back as a NSData object 
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

// Get JSON as a NSString from NSData response 
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 

//Print contents of json-string 
NSArray *statuses = [parser objectWithString:json_string error:nil]; 
NSLog(@"Array Contents: %@", [statuses valueForKey:@"messages"]); 
NSLog(@"Array Count: %d", [statuses count]); 


NSDictionary *results = [json_string JSONValue]; 
NSArray *tweets = [[results objectForKey:@"messages"] objectForKey:@"message"]; 

for (NSDictionary *tweet in tweets) 
{ 
    NSString *url = [tweet objectForKey:@"url"]; 
    NSLog(@"url is: %@",url); 
} 

Ich kann „Botschaften“ herausziehen und all die „Botschaft“ Blöcke sehen, aber ich bin nicht in der Lage, tiefer zu analysieren und herausziehen " user "," pass "und" url ".

+0

Die json: }

dann in Ihrem JSONDictonary die Daten, indem Sie zugegriffen werden string ist fehlerhaft, so wie du es hier geschrieben hast. Das Nachrichtenarray hat zwei offene geschweifte Klammern und nur einen Abschluss. – Felixyz

Antwort

9

Gelöst:

NSArray *tweets = [[results objectForKey:@"messages"] valueForKey:@"message"]; 
+0

Können Sie diese Antwort ein wenig mehr erklären? – Dewseph

6
Array({ 

    0=>Dictionary({ 

     response = Array({ 

     0=>Dictionary(Status = 200) 

     }) 

    }), 

    1=>Dictionary({ 

     messages = Array({ 

     0=> Dictionary({ 

      message = Array({ 

      0=>Dictionary({ 

       user = value, 

       pass=value, 

       url=value 

      }) 

      }) 

     }) 

     }) 

    }) 

}) 

So zugreifen Wörterbuch für Benutzer, übergeben, url,

nsarray *arr = jsonmainarray; 


arr = [[[jsonmainarray objectAtIndex: 1] objectforkey:@"messages"] objectatindex: 0]; 



nsdictionary *dict = [arr objectatindex: 0]; 

arr = [dict objectforkey:@"message"]; 

dict = [arr objectatindex: 0]; // Dictionary with user, pass, url 
+0

Gr8 ................ –

2

gibt es einen einfacheren Weg (meiner Meinung nach) JSON Parsen zu tun:)

- (void)loadJSONData:(NSString *)u{ 
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://expandurl.appspot.com/expand?url=%@", u]]; 
    NSData *rawJsonData = [NSData dataWithContentsOfURL:url]; 

    CJSONDeserializer *parser = [CJSONDeserializer new]; 
    NSError *error; 
    NSDictionary *jsonDictionary = [parser deserializeAsDictionary:rawJsonData error:&error]; 

    [parser release]; 

    NSArray *array = [jsonDictionary objectForKey:@"urls"]; 
} 

Alles, was Sie tun müssen, ist JSON touch ... wie Sheehan Alam erwähnt.

Sagen Sie, dass Sie diese Zeile von JSON-Daten erhalten:

{ "end_url" = "http://www.youtube.com"; Weiterleitungen = 0; "start_url" = "http://www.youtube.com"; Status = OK; urls = ( "http://www.youtube.com" );

[jsonDictionary objectForKey:@"urls"]; //This will return an Array since URLS is a array 
[jsondictionary objectForKey:@"en_url"]; //this will return an NSString since end_url is a string 

Hoffnung diese den Menschen helfen, so viel wie es mir geholfen =)

Mit freundlichen Grüßen Kristian

Verwandte Themen