在iphone中的Tableview中显示JSON数据

时间:2011-08-06 05:35:20

标签: iphone objective-c

下面是我想以这样的方式解析它的JSON,例如,对于例如date 1st,表格的那一部分和第二个日期的所有事件都应该显示另一部分中的所有相关事件 我使用下面的代码解析,但我没有得到所需的序列

   SBJsonParser *parser= [[SBJsonParser alloc] init];
  NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL   URLWithString:@"http://www.krsconnect.no/community/api.html?method=bareListEventsByCategory&appid=620&category-selected=350&counties-selected=Vest-Agder,Aust-Agder"]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSDictionary *object = [parser objectWithString:json_string error:nil];
NSArray *results = [parser objectWithString:json_string error:nil];
appDelegate.books1 = [[NSMutableArray alloc] init];
appDelegate.dates =[[NSMutableArray alloc]init];


for (int j=0;j<10; j++) {

    NSDictionary *dictOne = [results objectAtIndex:j];
    NSLog(@"%@ - %@", [dictOne objectForKey:@"date"]);

    Date  *aDate = [[Date alloc] initWithDictionary:[results objectAtIndex:j]];
    [appDelegate.dates addObject:aDate];



    [aDate release];




}


for (int i=0; i<10; i++) {

    NSDictionary *dictOne = [results objectAtIndex:i];

    NSArray *activitiesArray = [dictOne objectForKey:@"events"];
    NSDictionary *dictTwo = [activitiesArray objectAtIndex:i];
    NSDictionary *eventDict=[dictTwo objectForKey:@"event"];
//  NSLog(@"%@ - %@", [dictOne objectForKey:@"date"]);
//  NSLog(@"%@ - %@", [dictTwo objectForKey:@"affectedDate"]);
//  NSLog(@"%@ - %@", [eventDict objectForKey:@"location"]);


    NSInteger*date=[dictOne objectForKey:@"date"];

    NSInteger*affectedDate=[dictTwo objectForKey:@"affectedDate"];


    NSString*appId =[eventDict objectForKey:@"appId"];
    NSString*eventId=[eventDict objectForKey:@"eventId"];
    NSString*location=[eventDict objectForKey:@"location"];
    NSString*municipality=[eventDict objectForKey:@"municipality"];
    NSString*title=[eventDict objectForKey:@"title"];




    Book1 *aBook=[[Book1 alloc] initWithDate:date affectedDate:affectedDate location:location municipality:municipality title:title];


    [appDelegate.books1 addObject:aBook];

    int count=[appDelegate.books1 count];



    }

json格式如下所示

http://www.krsconnect.no/community/api.html?method=bareListEventsByCategory&appid=620&category-selected=350&counties-selected=Vest-Agder,Aust-Agder

1 个答案:

答案 0 :(得分:0)

您需要以不同的方式汇总数据。 我就是这样做的:

...
// why do you parse your json string two times?
//NSDictionary *object = [parser objectWithString:json_string error:nil];
NSArray *results = [parser objectWithString:json_string error:nil];

// You have memory leak here. I assume that books1 and dates are both properties with "retain" flag set.
//appDelegate.books1 = [[NSMutableArray alloc] init];
//appDelegate.dates =[[NSMutableArray alloc]init];

NSMutableArray *data = [NSMutableArray array]
self.data = data;

// check that what we've parsed is NSArray
if (results && [results isKindOfClass:[NSArray class]]) {
    for (NSDictionary *sectionDict in results) {
        if ([sectionDict isKindOfClass:[NSDictionary class]]) {
            NSString *sectionTitle = [[sectionDict objectForKey:@"date"] description];
            NSArray *events = [sectionDict objectForKey:@"events"];
            if (date && events && [events isKindOfClass:[NSArray class]]) {
                NSMutableArray *rows = [NSMutableArray arrayWithCapacity:[events count]];

                for (NSDictionary *eventDict in events) {
                    if ([eventDict isKindOfClass:[NSDictionary class]]) {
                        [rows addObject:@"testRow"];
                    }
                }

                [data addObject:[NSDictionary dictionaryWithObjectsAndKeys: sectionTitle, @"section", rows, @"rows", nil]];
            }

        }
    }
}

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tblView {
    return [data count];
}

- (NSInteger) tableView:(UITableView *)tblView numberOfRowsInSection:(NSInteger)section {
    return [[[data objectAtIndex:section] objectForKey:@"rows"] count];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [[data objectAtIndex:section] objectForKey:@"section"];
}

- (UITableViewCell *) tableView:(UITableView *)tblView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellID = @"DefaultCell";
    UITableViewCell *cell = (UITableViewCell *)[tblView dequeueReusableCellWithIdentifier:cellID];
    if ( cell == nil ) {    
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID] autorelease];
    }

    cell.textLabel.text = [[[data objectAtIndex:indexPath.section] objectForKey:@"rows"] objectAtIndex:indexPath.row];

    return cell;
}