IOS自动化解析JSON 详细步骤
做了IOS研发也有两年的时间了。对于JSON转模型这种基本工作,实在懒得浪费时间去解析。复杂的模型,一个个的添加属性,数组套字典,字典套字典,再加上一个字典几十个属性。模型建好,也就半天的时间过去了。
*******重点提示*************
对于一年以内的IOS开发人员,还是建议手工解析JSON,可以加强对json的理解,以及结构的理解。推荐使用JSONModel。纯手工解析,需要你对于每层结构都十分了解,才能解出JSON
JSONModel可参考
*********************************
对于已经很熟悉的工程师,推荐使用自动化工具解析,半天的工作量,1秒完成,0错误。高效迅速,
先介绍2个插件工具。
1.快速json转模型,自动生成.h .m文件 。脱离插件直接在MAC上运行的~
2.标准化输出json,打断点,直接可以从控制台拿到标准json格式,无需管后台要json了。只要有接口,就可以无脑取json。文件放到demo中,直接拉到工程中就可以使用
使用流程:
1.网络层断点,nslog输出json到控制台。注意要输出标准化json
+ (id)getTopNews:(NSInteger)page completionHandler:(void (^)(MJRootClass *, NSError *))completionHandler{
NSString *path = [NSString stringWithFormat:@"http://box.dwstatic.com/apiNewsList.php?action=l&newsTag=headlineNews&p=%ld&v=202&OSType=iOS10.0.1&versionName=3.4.0", page];
return [self get:path completionHandler:^(id obj, NSError *error) {
NSLog(@"%@",obj);
//使用YYModel自动化解析,需要区分数组,字典,写一个parse的分类
//!completionHandler ?: completionHandler([ESRootClass parse:obj], error);
//MJextension 通过Pod配置 对于首层是数组的情况 也可以仿照上面写一个parse类。基本用不上后台返回数据首层肯定是字典
!completionHandler ?: completionHandler([MJRootClass mj_objectWithKeyValues:obj], error);
}];
}
2.打开esjsonFormac,将标准化json输入到指定区域,开始点击start,生成模型。如图visualJson显示,当前json共两层,所以需要给两个model的名字,一个首层的,一个数组中的Model名字。
3.完成以后自动生成两个文件,一个.h一个.m。将模型类,拖入工程文件当中,这个插件支持MJextension以及YYmodel,除了自动生成模型中的属性,还会自动生成MJ或YY需要的类方法,比如数组对应字典时候的映射。都会自动生成
例如这样的方法,具体参考demo源码
#import "MJRootClass.h"
@implementation MJRootClass
+ (NSDictionary *)objectClassInArray{
return @{@"data" : [MJData class]};
}
@end
@implementation MJData
@end
4.在你需要转换模型的地方,使用对应的方法。本人DEMO中写了MJ的转换方法以及YYMODEL的转换方法。大家可以根据需要自行选择。本demo以一个新闻类的tableview为例子。转换模型方法,写在netManager中。
+ (id)getTopNews:(NSInteger)page completionHandler:(void (^)(MJRootClass *, NSError *))completionHandler{
NSString *path = [NSString stringWithFormat:@"http://box.dwstatic.com/apiNewsList.php?action=l&newsTag=headlineNews&p=%ld&v=202&OSType=iOS10.0.1&versionName=3.4.0", page];
return [self get:path completionHandler:^(id obj, NSError *error) {
NSLog(@"%@",obj);
//使用YYModel自动化解析,需要区分数组,字典,写一个parse的分类
//!completionHandler ?: completionHandler([ESRootClass parse:obj], error);
//MJextension 通过Pod配置 对于首层是数组的情况 也可以仿照上面写一个parse类。基本用不上后台返回数据首层肯定是字典
!completionHandler ?: completionHandler([MJRootClass mj_objectWithKeyValues:obj], error);
}];
}
到这步模型转换完成并且通过block回调到controller中。
5.最后一步,拿到回调的模型,对页面进行赋值
self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
[NetManager getTopNews:1034 completionHandler:^(MJRootClass *model, NSError *error) {
[self.tableView.mj_header endRefreshing];
if (!error) {
self.top = model;
[self.dataList removeAllObjects];
[self.dataList addObjectsFromArray:model.data];
[self.tableView reloadData];
if (self.top.totalPage == self.top.pageNum) {
[self.tableView.mj_footer endRefreshingWithNoMoreData];
}else{
[self.tableView.mj_footer resetNoMoreData];
}
}
}];
}];
6.最终展示效果,亲测MJ的自动生成模型+转换,以及YYModel的自动模型+转换,都可以正常使用~
源码下载地址--本人github:
关于源码demo报错问题,按照下图重新配置pch的相对路径即可~