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 objectForKey
和 valueForkey
但在上面的代码和
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 上的问题