2010-03-10 3 views
6

У меня есть следующие JSON объект:Разбор вложенных объектов JSON с JSON Framework для Objective-C

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

}

Я использую JSON-Framework (также попытался JSON Touch) для разбора через это и создать словарь. Я хочу получить доступ к блоку «сообщение» и вытащить значения «пользователь», «проход» и «URL».

В Obj-C У меня есть следующий код:

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

Я могу вытащить «сообщения» и увидеть все «сообщение» блоков, но я не могу разобрать все глубже и вытащить " user "," pass "и" url ".

+0

JSON строка неверна, то, как вы ее здесь написали. Массив сообщений имеет две открытые фигурные скобки и только одно закрытие. – Felixyz

ответ

9

Решено:

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

Можете ли вы объяснить этот ответ немного больше? – 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 

      }) 

      }) 

     }) 

     }) 

    }) 

}) 

Таким образом, чтобы получить доступ словарь для пользователя, передать, 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

есть более простой способ (на мой взгляд), чтобы сделать JSON синтаксический:)

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

Все, что вам нужно сделать, это использовать JSON touch ... как упоминает Шихан Алам.

Скажите, что вы получили эту строку данных JSON:

{ "end_url" = "http://www.youtube.com"; redirects = 0; "start_url" = "http://www.youtube.com"; status = ОК; urls = ( "http://www.youtube.com" ); }

затем в ваших JSONDictonary данных можно получить, выполнив:

[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 

Надежда эта помощь людям столько, сколько это мне помогло =)

С уважением Кристиана

Смежные вопросы