2010-03-10 25 views
6

Mam następujący obiekt JSON:Przetwarzanie zagnieżdżonych obiektów JSON z JSON ram dla Objective-C

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

}

Używam JSON-framework (próbował również JSON Touch) do analizowania przez to i utwórz słownik. Chcę uzyskać dostęp do bloku "message" i wyciągnąć wartości "user", "pass" i "url".

W Obj-C Mam następujący kod:

// 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); 
} 

mogę wyciągnąć „wiadomości” i zobaczyć wszystkie „message” bloków, ale jestem w stanie analizować głębiej i wyciągnąć " user "," pass "i" url ".

+0

JSON ciąg jest zniekształcony, tak jak napisałeś go tutaj. Tablica komunikatów ma dwa otwarte nawiasy klamrowe i tylko jedno zamykanie. – Felixyz

Odpowiedz

9

rozwiązany:

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

Czy możesz wyjaśnić tę odpowiedź trochę bardziej? – 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 

      }) 

      }) 

     }) 

     }) 

    }) 

}) 

Tak więc, aby uzyskać dostęp do słownika dla użytkownika, zdać, 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

istnieje prostszy sposób (moim zdaniem), aby zrobić JSON parsowania:)

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

Wszystko, co musisz zrobić, to użyć dotyk JSON ... jak wspomina Sheehan Alam.

Powiedzmy, że masz tę linię danych JSON:

{ "end_url" = "http://www.youtube.com"; przekierowania = 0; "start_url" = "http://www.youtube.com"; status = OK; urls = ( "http://www.youtube.com" ); }

następnie w swoim JSONDictonary danych można uzyskać wykonując:

[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 

Nadzieja to pomóc ludziom jak najwięcej jak to pomogło mi =)

poważaniem Kristian

Powiązane problemy