JSON解析2

 

用到第三方框架,与数据解析没关系,设置占位图片使用的!

本文解析JSON数据,tableView将视频展示出来.

本地服务器数据路径:http://localhost/resources/vedios

同一份数据的JSONXML的显示的样式是不同的.

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可以播放视频

封装截图,写代码很麻烦就不封装了!

 

 

posted @   LDSmallCat  阅读(207)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示