2013-07-29 24 views
1

我能夠解析我的JSON文件的一部分,但如果我想深入該結構中,我會迷路。這裏是我的JSON:解析目標C中的JSON信息(多個級別)

{ 
"album":[ 
       { 
       "album_titre":"Publicité", 
       "album_photo":"blabla.jpg", 
       "album_videos":[ 
           { 
           "titre_video":"Chauffage Compris", 
           "duree_video":"01'25''", 
           "photo_video":"chauffage.jpg", 
           "lien_video":"www.bkjas.jhas.kajs" 
           }, 
           { 
           "titre_video":"NIFFF 2012", 
           "duree_video":"01'43''", 
           "photo_video":"nifff.jpg", 
           "lien_video":"www.bkjas.jhas.kajs" 
           } 
           ] 
       }, 
       { 
       "album_titre":"Events", 
       "album_photo":"bloublou.jpg", 
       "album_videos":[ 
           { 
           "titre_video":"Auvernier Jazz", 
           "duree_video":"01'15''", 
           "photo_video":"auvernier.jpg", 
           "lien_video":"www.bkjas.jhas.kajs" 
           }, 
           { 
           "titre_video":"NIFFF 2011", 
           "duree_video":"01'03''", 
           "photo_video":"nifff2011.jpg", 
           "lien_video":"www.bkjas.jhas.kajs" 
           } 
           ] 
       }, 
       { 
       "album_titre":"Culture", 
       "album_photo":"bilibl.jpg" 
       }, 
       { 
       "album_titre":"Postproduction", 
       "album_photo":"bizoubzou" 
       } 
      ] 
} 

這是我的Objective-C代碼:

- (void)fetchedData:(NSData *)responseData { 

NSError* error; 
NSDictionary *document = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

if (document==nil) 
{ 
    NSLog(@"oops\n%@", error); 
} 

NSArray *album = document[@"album"]; 


for(NSDictionary *albumDictionary in album) 
{ 
    [album_titre addObject:albumDictionary[@"album_titre"]]; 
    [album_photo addObject:albumDictionary[@"album_photo"]]; 

    for(NSDictionary *album_videosDictionary in albumDictionary[@"album_videos"]) 
    { 
     [titre_video addObject:album_videosDictionary[@"titre_video"]]; 
     [duree_video addObject:album_videosDictionary[@"duree_video"]]; 
     [photo_video addObject:album_videosDictionary[@"photo_video"]]; 
     [lien_video addObject:album_videosDictionary[@"lien_video"]]; 
    } 

} 

[self.tableView reloadData]; 

} 

我不能達到與例如包含所有「titre_video」相當於建立一個數組來「album_titre」 : 「publicité」。所以它應該包含「Chauffage Compris」和「Nifff 2012」。

我知道這是一個簡單的問題,但我搜索了一段時間,仍然無法做到這一點。

非常感謝。

尼古拉斯

+1

轉到json.org並花費5-10分鐘學習JSON語法。 (這很簡單。)然後,我喜歡說,「剝洋蔥」,一次一層。現在避免在一個語句中深入幾層的「巧妙」構造。相反,將每個「圖層」分配給不同的臨時變量,以便更易於調試。 (並且熟悉JSON在轉換爲NS對象和NSLoggeed時發生的變化 - 特別是NSArray使用'()'字符而不是'[]')。 –

回答

4

的關鍵是要理解JSON結構:

{} - - 這意味着潛在的對象是一個字典。

[ ] -- this means the underlyingobject is an array 

- (void)fetchedData:(NSData *)responseData { 

    NSError* error; 
    NSDictionary *document = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

    // all titre:video for album_titre:publicite 
    NSArray *albumArray = [document objectForKey:@"album"]; 
    NSDictionary *dict = [albumArray objectAtindex:0]; 
    NSArray *videos = [dict objectForKey:@"album_videos"]; 

    // to fetch Videos inside album_videos 
    // here you will get al the videos inside key titre_video 
    NSMutableArray *titreVideoArray = [[NSMutableArray alloc]init]; 
    for(int i=0; i< videos.count; i++){ 
     NSDictionary *dict = [videos objectAtindex:i]; 
     NSArray *titreVideos = [dict objectForKey:@"titre_video"]; 
     [titreVideoArray addObject: titreVideos]; 
    } 
    } 

看來你想獲取所有與不同的「album_titre」的影片。 我建議你使用NSPredicate。

NSArray *videos = [self videosArrayForTitle:@"Publicité" albumArray:albumArray]; 

在這裏,我們通過標題和專輯Array從上面取我們的視頻數組。

- (NSArray *)videosArrayForTitle:(NSString *)title albumArray:(NSArray *)albumArray{ 
NSPredicate *resultPredicate=[NSPredicate predicateWithFormat:@"SUBQUERY(album_titre, $content, $content  CONTAINS %@)[email protected] > 0", title]; 
NSArray *searchResults=[albumArray filteredArrayUsingPredicate:resultPredicate]; 
NSArray *videos = [searchResults objectForKey:@"album_videos"]; 
return videos; 
} 
+1

請解釋爲什麼downvote。它會幫助我改進答案或將其刪除。 –

+0

謝謝,它接近我所需要的。但我怎麼現在只有一個「titre_video」數組? –

+0

謝謝普尼,但我對NSPredicate一無所知。難道不能像我試圖做的那樣以簡單的方式保持下去?我會留下只有4個專輯,所以如果它的4塊代碼,我不會想太多。 –

0

{}表示的NSDictionary []表示NSArray的

您的JSON複製到一個文本編輯文件,然後進入深。深入時,可以使用NSLog()打印數據。

希望它能幫助你。