JSON解析2
用到第三方框架,与数据解析没关系,设置占位图片使用的!
本文解析JSON数据,用tableView将视频展示出来.
本地服务器数据路径:http://localhost/resources/vedios
同一份数据的JSON和XML的显示的样式是不同的.
JSON形式显示的数据:http://localhost/resources/vedios.json
解析后打印的数据
在JSON数据上可以看到最外层解析后为数组,数组里面为字典,KVC字典转模型.
图片右侧为模拟器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | // // 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可以播放视频
封装截图,写代码很麻烦就不封装了!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥