Maikel Slomp
Maikel Slomp

Reputation: 1

Parse a JSON array of dictionaries in a tableview

I'm stuck at the point of parsing a JSON array of dicts (http://www.cjs-design.nl/json.php) into a tableview. I just want to display the title's first, ill figure out detailviews later.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}


NSString *rawJson = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.cjs-design.nl/json.php"]];

// No connection or file not found
if ([rawJson length] == 0) {
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"Foutmelding" message:@"De URL kon niet worden gevonden" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    [alert show];
    [alert release];
    [rawJson release];
    return;
}


SBJSON *parser = [[[SBJSON alloc] init] autorelease];
// 1. get the top level value as a dictionary
NSDictionary *jsonObject = [parser objectWithString:rawJson error:NULL];
// 2. get the object as an array
NSArray *list = [jsonObject objectForKey:@"book"];
// 3. iterate the array; each element is a dictionary.    

for (NSDictionary *book in list)
{
    // that contains a string for the key "title"
    NSString *title = [book objectForKey:@"title"];
    cell.textLabel.text = title;
}
return cell;

}

Upvotes: 0

Views: 2184

Answers (2)

Maikel Slomp
Maikel Slomp

Reputation: 1

- (void)viewDidLoad
{
    [super viewDidLoad]; 
    NSString *rawJson = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.cjs-design.nl/json.php"]];
    // No connection or file not found
    if ([rawJson length] == 0) {
        UIAlertView *alert = [[UIAlertView alloc]
                              initWithTitle:@"Foutmelding" message:@"De URL kon niet worden gevonden" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alert show];
        [alert release];
        [rawJson release];
        return;
    }
    SBJsonParser *parser = [[SBJsonParser alloc] init];
    // 1. get the top level value as a dictionary
    NSDictionary *jsonObject = [parser objectWithString:rawJson error:NULL];  
    NSLog(@"Dict: %@",jsonObject);
    list = [jsonObject objectForKey:@"book"];
    NSLog(@"List: %@",list);
    [rawJson release];
}

When I NSlog them, they both print Null, so the string doesnt get parsed? the string contains a dictionary of arrays tho.

Upvotes: 0

Brandon Schlenker
Brandon Schlenker

Reputation: 5088

Somewhere i.e. viewDidLoad, you need to parse your JSON. Then implement UITableView's dataSource methods.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
  return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   return [list count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

    static NSString *CellIdentifier = @"CellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    }
    NSDictionary *book = [list objectAtIndex:indexPath.row];
    NSString *title = [book objectForKey:@"title"]; 

    cell.titleLabel.text =  title;
}

Upvotes: 2

Related Questions