1

I've been stuck on a problem for a few days now. I have searched the internet and found many answers, but nothing that seems to work - I may not grasp how to modify my own code.

I have a JSON connection which I make a dictionary. This all works very well when I dont have a multilevel dictionary, but as soon as I have:

{
  "Table": [
    {
      "MENUID": 1072.0,
      "MENUDESC": "HOME           ",
      "PARENTMENUID": null,
      "NAVIGATETO": "content.aspx?item=1072&pid=0",
      "NAVIGATETO2": "default.aspx?item=1072&pid=0",
      "PROTECTED": null,
      "parentmenuid2": null
    },
    {
      "MENUID": 1073.0,
      "MENUDESC": "PRODUCTS & SERVICES",
      "PARENTMENUID": null,
      "NAVIGATETO": "#",
      "NAVIGATETO2": "default.aspx?item=1073&pid=0",
      "PROTECTED": null,
      "parentmenuid2": null
    }
  ]
}

I adapt my code as follows:

- (void)fetchTweets
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL: 
                        [NSURL URLWithString: @"http://adhoc.nyxtek.co.za/spfjsonws/default2.aspx"]];

        NSError* error;

        menuItems = [NSJSONSerialization JSONObjectWithData:data
                                                 options:kNilOptions 
                                                   error:&error];
        NSArray * allKeys = [menuItems allKeys];
        NSLog(@"Count : %d", [allKeys count]);


        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });
    });
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return menuItems.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"TweetCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    NSDictionary *tweet = (NSDictionary *)[menuItems objectForKey:@"Table"];

    NSArray * allKeys = [tweet allKeys];
    NSLog(@"Count : %d", [allKeys count]);


    //NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];
    NSString *text = [tweet objectForKey:@"MENUDESC"];
    NSString *name = [tweet objectForKey:@"MENUID"];

    cell.textLabel.text = text;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"by %@", name];

    return cell;
}

Specifically this line of code is not working:

NSDictionary *tweet = (NSDictionary *)[menuItems objectForKey:@"Table"];

My first count of the outer dictionary is 1 which is correct, but my second count of the new above dictionary is 0 which is wrong.

I have applied much of this from researching previous questions as I understand the importance of research, but I still cant seem to find a specific fault.

Any assistance would be appreciated.

paulmelnikow
  • 16,895
  • 8
  • 63
  • 114
Jimmypooza
  • 97
  • 2
  • 8

1 Answers1

2

Table is an array (of dictionaries):

"Table": [
...
]

So the code should be:

NSArray *tweet = (NSArray *)[menuItems objectForKey:@"Table"];
trojanfoe
  • 120,358
  • 21
  • 212
  • 242