2013-08-22 5 views
-1

En ce moment j'apprends comment obtenir des données du Web en utilisant JSON. Je veux obtenir une image pour chacun de mes messages (à partir d'une application Rails). Suite à la bibliothèque Treehouse tutoriel, je dois faire quelque chose comme ceci:Analyse des objets JSON imbriqués

TableViewController.m

self.upcomingReleases = [NSMutableArray array]; 

NSArray *upcomingReleasesArray = [dataDictionary objectForKey:@"upcoming_releases"]; 

for (NSDictionary *upcomingReleaseDictionary in upcomingReleasesArray) { 
    UpcomingRelease *upcomingRelease = [UpcomingRelease upcomingReleaseWithReleaseName:[upcomingReleaseDictionary objectForKey:@"release_name"]]; 
    upcomingRelease.thumbnail = [upcomingReleaseDictionary objectForKey:@"thumbnail"]; 
    upcomingRelease.url = [NSURL URLWithString:[upcomingReleaseDictionary objectForKey:@"url"]]; 
    [self.upcomingReleases addObject:upcomingRelease]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    UpcomingRelease *upcomingRelease = [self.upcomingReleases objectAtIndex:indexPath.row]; 

    NSData *imageData = [NSData dataWithContentsOfURL:upcomingRelease.thumbnailURL]; 
    UIImage *image = [UIImage imageWithData:imageData]; 

    cell.imageView.image = image; 
    cell.textLabel.text = upcomingRelease.release_name; 

    return cell; 
} 

UpcomingRelease.h

@property (nonatomic, strong) NSString *release_name; 
@property (nonatomic, strong) NSString *thumbnail; 
@property (nonatomic, strong) NSURL *url; 

//Designated Initializer 
- (id) initWithReleaseName:(NSString *)release_name; 
+ (id) upcomingReleaseWithReleaseName:(NSString *)release_name; 

- (NSURL *) thumbnailURL; 
- (NSString *) formattedDate; 

@end 

UpcomingRelease.m

- (NSURL *) thumbnailURL { 
    return [NSURL URLWithString:self.thumbnail]; 
} 

Je suis censé remplacer toute la "vignette" avec ma propre chaîne. Le problème est que mes images sont à l'intérieur d'un objet imbriqué et il y en a plus de 1. Je veux appeler l'URL du pouce du premier fichier image_file dans chacun de mes messages. Comment puis-je faire ceci?

Merci.

Mon JSON API

upcoming_releases: [ 
{ 
    id: 2, 
    release_name: "Nike Lebron X Low", 
    release_price: "165", 
    release_colorway: "Raspberry-Red/Blueprint-Court", 
    release_date: "2013-09-07T00:00:00.000Z", 
    url: "http://obscure-lake-7450.herokuapp.com/upcoming/2", 
    images: [ 
    { 
     image_file: { 
     image_file: { 
      url: "https://s3.amazonaws.com/soleresource/uploads/releases/nike-lebron-x-low-raspberry.jpg", 
      thumb: { 
      url: "https://s3.amazonaws.com/soleresource/uploads/releases/thumb_nike-lebron-x-low-raspberry.jpg" 
      } 
     } 
     } 
    }, 
    { 
     image_file: { 
     image_file: { 
      url: "https://s3.amazonaws.com/soleresource/uploads/releases/nike-lebron-x-low-raspberry-2.jpg", 
      thumb: { 
      url: "https://s3.amazonaws.com/soleresource/uploads/releases/thumb_nike-lebron-x-low-raspberry-2.jpg" 
      } 
     } 
     } 
    }, 
    ] 
} 
+2

Afficher le code que vous avez jusqu'à présent pour analyser le JSON et extraire les données dont vous avez besoin. – rmaddy

+0

Je viens de mettre à jour ma question. – ChrisBedoya

+1

Veuillez vous rendre sur json.org et étudier la syntaxe JSON. En particulier noter la chose appelée un "tableau". –

Répondre

0

En supposant que vous pouvez compter sur la structure du flux JSON, après la conversion en un objet de base (NSArray dans ce cas):

NSString *fileURL; 
NSString *thumbURL; 
if (jsonArray.count) { 
    NSDictionary *firstRelease = jsonArray[0]; 
    NSArray *images = firstRelease[@"images"]; 
    if (images.count) { 
     NSDictionary *firstImage = images[0][@"image_file"]; 
     fileURL = firstImage[@"image_file"]; 
     thumbURL = firstImage[@"thumb"]; 
    } 
} 
0

Vous peut utiliser SBJSON pour aider à analyser les données. Par exemple, pour obtenir les données d'URL, puis l'analyser dans un NSDictionary, vous pouvez le faire:

NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.example.com"]]; 
SBJsonParser *parser = [[SBJsonParser alloc] init]; 
NSDictionary *response = [parser objectWithData:jsonData]; 

Pour un bon exemple de travail sur la façon de faire, consultez cette APP.NET public stream client pour iOS .

Questions connexes