2013-07-29 1 views
1

Я могу разобрать часть моего файла JSON, но если я захочу углубиться в структуру, я потеряюсь. Вот мой JSON:Анализ информации JSON в Objective C (несколько уровней)

{ 
"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" 
       } 
      ] 
} 

И вот моя цель-с-код:

- (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() для печати данных при глубоком проникновении.

Надеюсь, это поможет вам.

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