IOS AFNetworking的使用与YYModel解析JSON数据
Posted 全栈攻城狮之道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS AFNetworking的使用与YYModel解析JSON数据相关的知识,希望对你有一定的参考价值。
一个人习惯了忙碌,突然闲下来,发现自己一个人真的很无聊,发呆发着发着情绪也会变得焦虑。时间是宝贵的,何不用发呆的时间给自己充点知识呢?
---- 就业
续篇,上篇“IOS AFNetworking的使用与YYModel解析JSON数据(一)”介绍了如何使用cocoapod导入AFNetworking与YYModel框架,使用AFNetworking监听网络状态改变,封装post,get以及图片文件上传方法。本篇继续介绍如何调用封装的post,get方法执行网络请求,如何使用YYModel解析api返回的json数据。
以调用我之前写的椰子商城app的接口为例,接口域名http://wujiuye.yezishop.shop。关于椰子商城app已开源在github,该项目是我在校做的一个android期末作品,源码可在https://github.com/wujiuye/YeZiShop和https://github.com/wujiuye/YeZiShopWeb下载。
ViewController.xib页面内容:一个UILabel控件,用于显示请求结果;两个UIButton按钮,点击发送post请求与get请求。
ViewController.m中为“发送post请求“按钮和“发送get请求“按钮添加点击事件:
当点击“发送post请求“按钮时,调用HttpsNetworkManager封装的doPost方法发送一个post请求并获取返回的json字符串,将json字符串显示到屏幕上:
当点击“发送get请求“按钮时,调用HttpsNetworkManager封装的doGet方法请求api接口并将返回json字符串显示到屏幕上:
编译运行项目,观察运行结果:
因为接口支持post和get请求,所以两种方式请求同一api的结果都是相同的。
接口:http://wujiuye.yezishop.shop/api/search?type=keyword&keywordOrClass=毛衣&page=1的请求结果如下:
json数据包含三个字段:error_code服务器返回的请求状态码,error_message服务器返回的请求状态信息,data为请求返回的数据。data下面包含一个字段:merchlist,merchlist字段为商品搜索结果列表,每个商品包含的字段信息又很复杂,比如一个商品有颜色尺码列表,图片列表,参数列表。
像这样复杂的json数据如何使用YYModel做解析? 首先先定义商品Model(商品类)。
首先将merchlist数组里面的每个字段抽象为一个类,如下表格:
# | merchlist数组的item抽象为一个类Merch | 字段类型 |
---|---|---|
1 | clas(商品分类) | 对象 |
2 | colorSize(颜色尺码列表) |
数组 |
3 | htmlBody(商品详情) | 字符串 |
4 | id | 整型 |
5 | images(图片列表) | 数组 |
6 | merchName(商品名称) | 字符串 |
7 | parameter(商品参数) | 数组 |
8 | pirce(单价) | 浮点数 |
9 | sales(好像是浏览量,忘了) | 整型 |
将merch类中类型为对象的属性抽象为一个类,将merch类中类型为数组的的属性的每个item抽象抽象为一个类(看情况,有时候可以使用字典类替代)。
# | merch类的clas字段:Clas类 | 字段类型 |
---|---|---|
1 | id | 整型 |
2 | imgUrl(分类图标) |
字符串 |
3 | name(分类名称) | 字符串 |
4 | parentsClass(指向父分类) | Clas类 |
# | merch类的colorSize数组的item:ColorSize类 | 字段类型 |
---|---|---|
1 | id | 整型 |
2 | color(颜色) |
字符串 |
3 | size(尺码) | 字符串 |
4 | stock | 整型 |
# | merch类的images数组的item:MerchImage类 | 字段类型 |
---|---|---|
1 | id | 整型 |
2 | bigPath(大图路径) |
字符串 |
3 | newPath | 字符串 |
# | merch类的parameter数组 的item:MerchParameter类 |
字段类型 |
---|---|---|
1 | id | 整型 |
2 | key |
字符串 |
3 | value | 字符串 |
用Object-c实现上面列表中的类:
在项目根目录下新建文件夹,命名为Model。(下面给出gif图,我在刚开始学ios开发的时候百度找了好多教程都找不到教怎么像android一样建一个文件夹而不仅仅只是建一个分组的教程,后面自己摸索出来的,在这分享给各位有需要的朋友。)
在Model下新建一个Clas类,ColorSize类,MerchImage类,MerchParameter类,Merch类:
Clas类:
由于id是oc的关键字,所以将所有的id字段改为mid。YYModel解析json为oc对象时,如果类的属性名与json的字段名相同,那么不需要自定义解析映射。由于Clas类的mid与json中的id字段名不同,所以需要实现一个类方法modelCustomPropertyMapper
方法,该方法返回的是一个字典类对象NSDictionary,其中key为oc类中的属性名,value为对应json的字段名。
Clas类还包含一个parentsClass属性,该属性的类型与自身相同,却又不是常用数据类型,所以需要显式告诉YYModel将该属性对应的json字段解析为Clas类型的对象(好像不是必须的,属性为数组的情况下才是必须的),这时需要在Clas的实现文件中添加一个类方法:
+ (NSDictionary *)modelContainerPropertyGenericClass
指定parentsClass字段解析为Clas类型的对象。
ColorSize类:
MerchImage类:
MerchParameter类:
Merch类:
Merch类有些复杂,我在Merch.h中又声明了一个MerchList类,是因为返回的json最外层包含error_code,error_message,和data三个字段的数据,而真正Merch对象列表在data下的merchList字段下。
Merch类除了包含常用数据类型的属性和自定义的Clas类型的属性外,还包含三个数组类型的属性,所以必须要告诉YYModel数组类型的item解析为声明类型的对象。
Merch中添加一个类方法:
+ (NSDictionary *)modelContainerPropertyGenericClass
指定clas字段解析为Clas类型的对象;
指定colorSize数组的item解析为ColorSize类型的对象;
指定images数组的item解析为MerchImage类型的对象;
指定parameter数组的item解析为MerchParameter类型的对象。
仔细看下图,你会发现MerchList中的modelCustomPropertyMapper方法中属性-字段映射表的merchList与别的写法不一样。是因为merchList字段与error_code在不同级别,error_code与data字段同级,而merchList则是data下的一个字段,没错,YYModel还可以这样解析数据,是不是很方便?
MerchList中添加一个类方法:
+ (NSDictionary *)modelContainerPropertyGenericClas
指定merchList数组的item解析为Merch类型的对象;
编写完所有Model之后就是测试了。我们将之前的测试post请求的方法改一改,将post请求完成获取的json数据使用yymodel解析成oc对象。
下断点调试查看解析是否成功:
完结。。。。。。
以上是关于IOS AFNetworking的使用与YYModel解析JSON数据的主要内容,如果未能解决你的问题,请参考以下文章
IOS AFNetworking的使用与YYModel解析JSON数据
iOS开发之旅AFNetworking与SDWebImage下载图片
AFNetworking 2.0 iOS 7 复制与 AFHTTPRequestOperation.h 文件中的区域警告