JSON 解析:在 UITableView 上显示数据

Posted

技术标签:

【中文标题】JSON 解析:在 UITableView 上显示数据【英文标题】:JSON parsing: show data on UITableView 【发布时间】:2014-03-24 13:04:17 【问题描述】:

这是我必须解析的给定API。我还必须在我的UITableView 上显示名称。我想获取名称 n 的值,将其显示在表格视图中。 这是代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


    return [ episodes count];

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

    static NSString *simpleTableIdentifier = @"SimpleTableItem";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    

    cell.textLabel.text = [[ episodes objectAtIndex:indexPath.row] objectForKey:@"names"];


    return cell;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath


    UIAlertView *logoutConfirm = [[UIAlertView alloc]initWithTitle:@"Toilet Finder" message:@"" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Display on Map",@"Route",@"Cancel", nil];
    logoutConfirm.tag = 111;
    [logoutConfirm show];



- (void) parseJSONWithURL:(NSURL *) jsonURL


    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
 dispatch_async(queue, ^
        NSError *error = nil;
     NSString *json = [NSString stringWithContentsOfURL:jsonURL
                                               encoding:NSASCIIStringEncoding error:&error];
     if (error == nil)
         WebInServe=@"http://api.kivaws.org/v1/loans/search.json?status=fundraising";
        NSLog(@"URL %@", WebInServe);
         NSURL *Final_Url = [NSURL URLWithString:WebInServe];

         NSData*   jsonData = [NSData dataWithContentsOfURL: Final_Url];


         NSError* error;

         jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
         NSLog(@"What is contain let me check %@",jsonDict);
         NSArray* latestLoans = [jsonDict objectForKey:@"loans"];

         NSLog(@"loans in array: %@", latestLoans);


          episodes = [[jsonDict valueForKey:@"latestLoans"]valueForKey:@"name"];


                 if (error == nil)
         
             dispatch_async(dispatch_get_main_queue(), ^
                 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
                  episodes = [[jsonDict valueForKey:@"latestLoans"]valueForKey:@"name"];
                 [tableView reloadData];
             );
         

我尝试过使用:

episodes = [[jsonDict valueForKey:@"latestLoans"]objectForKey:@"name"];

我已经使用了几个 tymes objectForKeyvalueForkey 但在上面的代码和

cell.textLabel.text = [[ episodes objectAtIndex:indexPath.row] objectForKey:@"names"];

cellForRowAtIndexPath: method中的代码行

但是数据没有显示在tableview上...确实显示在NSLog...

【问题讨论】:

查看本教程:raywenderlich.com/5492/working-with-json-in-ios-5 【参考方案1】:

为什么使用dispatch_queues 而不是NSURLConnection 的专用异步API?

正如 Apple 的并发编程指南中所解释的,当已经有专用 API 以并发方式执行某些任务时,请避免通过在异步中包装同步调用(如您的情况下为 +[NSString stringWithContentOfURL:])来创建自己的并发版本队列(例如 dispatch_async 在您的情况下的并发队列)。


此外,您的 latestLoans 变量(然后是 NSLog)从名为 @"loans" 的键中提取其内容,但在下一行中,当您尝试提取剧集时,您从假定为关联到 @"latestLoans" 键。您的代码可能存在一些差异,不是吗? 这可能是您代码中的主要问题。


最后有时你使用valueForKey:(这是一种使用自省的通用键值编码方法,根本不是专用的NSDictionary-特定方法)而不是objectForKey:(这是你需要的从NSDictionary 访问对象时使用)。

当然valueForKey: 可以工作,但objectForKey:NSDictionary 的专用方法,它会更有效。 就我个人而言,我什至更喜欢 Object Literals 的新“Objective-C 现代表示法”,即dict[key],编译器会自动为您翻译成objectForKey:(这个[] 表示法只是更简洁的一些语法糖)

所以我的代码建议来了:

...
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* resp, NSData* jsonData, NSError* err) 
  ...
  NSDictionary* jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
  NSArray* latestLoans = jsonDict[@"loans"];
  self.episodes = latestLoans[@"name"];
  [self.tableView reloadData];
];

【讨论】:

【参考方案2】:

看来问题出在这里:

episodes = [[jsonDict valueForKey:@"latestLoans"]valueForKey:@"name"];

JSON 响应的根只有两个项目 - “分页”和“贷款”。您要求“最新贷款”。由于 JSON 的根级别中没有此类项目,因此您将在情节中获得 nil。 我认为您应该使用您为日志记录执行的调用:

NSArray* latestLoans = [jsonDict objectForKey:@"loans"];

试试

episodes = [jsonDict objectForKey:@"loans"];

而不是

episodes = [[jsonDict valueForKey:@"latestLoans"]valueForKey:@"name"];

【讨论】:

以上是关于JSON 解析:在 UITableView 上显示数据的主要内容,如果未能解决你的问题,请参考以下文章

解析 JSON 并将其显示在 UITableView 上的问题

UITableView 中的第二个视图不会显示来自 JSON 的解析数据

将 Json 解析为 UITableview

JSON解析UITableViewController

在 UITableView 上显示图像的最佳实践

UIViewController中的UITableView不显示json?