JSON解析2
用到第三方框架,与数据解析没关系,设置占位图片使用的!
本文解析JSON数据,用tableView将视频展示出来.
本地服务器数据路径:http://localhost/resources/vedios
同一份数据的JSON和XML的显示的样式是不同的.
JSON形式显示的数据:http://localhost/resources/vedios.json
解析后打印的数据
在JSON数据上可以看到最外层解析后为数组,数组里面为字典,KVC字典转模型.
图片右侧为模拟器
// // ViewController.m // key> NSURLSession解析JSON // // Created by apple on 15/11/6. #import "ViewController.h" #import "LDModel.h" #import "UIImageView+WebCache.h" #import <MediaPlayer/MediaPlayer.h> #import <AVFoundation/AVFoundation.h> #import <AVKit/AVKit.h> @interface ViewController ()<UITableViewDelegate,UITableViewDataSource> //数据源.用来存放数据模型(JSON里面的字典) @property(nonatomic,strong)NSMutableArray * videos; @property(nonatomic,strong)UITableView * tableView; @end @implementation ViewController //懒加载数据源 -(NSMutableArray *)videos{ if (!_videos) { _videos = [NSMutableArray array]; } return _videos; } - (void)viewDidLoad { [super viewDidLoad]; //创建tableView UITableView * tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; //设置代理/数据源(注意遵守协议) tableView.delegate = self; tableView.dataSource = self; //让属性tableView指向创建的tableView self.tableView = tableView; //添加到VC.view [self.view addSubview:tableView]; //从服务器加载数据,自定义方法 [self downloadDataFromUrlString:@"http://localhost/resources/vedios.json"]; } //NSURLSession异步发送请求.加载数据 - (void)downloadDataFromUrlString:(NSString *)urlString { //1.创建请求 NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; #pragma 解析JSON数据是在NSURLSession 的 Block中做的 //2.发送请求,开启子线程发送请求,得到数据后回到主线程刷新数据,更新界面 [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //判断,如果服务器返回的data不为空,且无错误-->进行解析 if (data && ! error) { //JSON--->OC,用数组存放解析后的字典,为什么是字典即options(枚举) 参考前面文章 NSArray * dataArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; NSLog(@"%@",dataArray); //遍历数组,模型化(遍历这个数组,取出每一个Dict模型化后存放到数组中) [dataArray enumerateObjectsUsingBlock:^(NSDictionary * obj, NSUInteger idx, BOOL * _Nonnull stop) { //字典转模型 LDModel * model = [LDModel modelWithDict:obj]; //存放到数组中 [self.videos addObject:model]; }]; //回到主线程刷新数据 dispatch_async(dispatch_get_main_queue(), ^{ //刷新数据(等到数据下载完毕后,转模型后) [self.tableView reloadData]; }); } }] resume];//默认关闭,resume开启 } #pragma UITableViewDelegate,设置cell高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 80; } //如果点击了 cell 就要跳转到播放器 播放视频(注意方法不要写错,有个方法和他很像) - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //从数组中取出选中的模型数据 LDModel * model = self.videos[indexPath.row]; //根据模型属性的url创建路径,用来找到此视频的位置,有时路径需要再次拼接, NSURL * url = [NSURL URLWithString:model.url]; //创建播放控制器 AVPlayerViewController * vc = [[AVPlayerViewController alloc] init]; //创建播放器,通过这个路径直接找到这个视频, AVPlayer * player = [AVPlayer playerWithURL:url]; //指针指向创建的player vc.player = player; //从当前控制器跳转到播放器控制器页面,播放视频 [self presentViewController:vc animated:YES completion:^{ //设置自动播放 [player play]; }]; } #pragma UITableViewDataSource //一个cell对应一个model,cell数等于数组中模型数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.videos.count; } //cell 长什么样 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ //注册cell static NSString * identifier = @"Cell"; //检测是否有可以重用的cell,如果有就不创建 UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier]; //如果没有可以重用的cell,创建新的cell if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; } //将数据模型化便于赋值,取值, LDModel * model = self.videos[indexPath.row]; cell.textLabel.text = model.name; cell.detailTextLabel.text = [NSString stringWithFormat:@"时长%@ 分钟",model.length]; //设置图片 //通过这个属性创建url,根据url找到这个图片 NSURL * url = [NSURL URLWithString:model.image]; //第三发框架设置占位图片,当网络状况不好时,会看到一张图片,就是占位图片 [cell.imageView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"backGroundPic"]]; return cell; } @end
点击模拟器tableViewCell可以播放视频
封装截图,写代码很麻烦就不封装了!