iOS开发——网络请求数据处理
2016-06-05 17:54
495 查看
之前博客中介绍了iOS中常用的网络框架AFNetworking,其中常用的POST请求方法如下:
我们可以看到请求成功后返回给我们的是一个已经解析好的数据字典responseObject,然后我们需要做的就是处理这个数据字典。处理字典常用的方法是利用KVC字典转模型。字典转模型我这里总结两种方法:(1)自己编写代码 (2)利用第三方框架MJExtension
1.自己编写代码(只使用与简单的字典转模型)
假如字典如下:
建立模型User,User.h中代码如下:
User.m中代码如下:
然后我们就可以直接利用User的类方法+(instancetype)accountWithDict:(NSDictionary *)dic来实现字典转模型。
2.利用第三方框架MJExtension(建议使用)
MJExtension is a fast, convenient and nonintrusive conversion between JSON and model.
MJExtension是一个转换速度快、使用简单方便的字典转模型框架
使用前先将MJExtensionExample/MJExtensionExample/MJExtension文件夹中的所有源代码拽入项目中
(1)最简单的字典转模型
(2)模型中嵌套模型
(3)模型中有个数组属性,数组里面又要装着其他模型
(4)模型中的属性名和字典中的key不相同(或者需要多级映射)
(5)将一个字典数组转成模型数组
(6)将一个模型转成字典
(7)将一个模型数组转成字典数组
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSDictionary *parameters = @{@"foo": @"bar"}; [manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }];
我们可以看到请求成功后返回给我们的是一个已经解析好的数据字典responseObject,然后我们需要做的就是处理这个数据字典。处理字典常用的方法是利用KVC字典转模型。字典转模型我这里总结两种方法:(1)自己编写代码 (2)利用第三方框架MJExtension
1.自己编写代码(只使用与简单的字典转模型)
假如字典如下:
NSDictionary *dict = @{ @"name" : @"Jack", @"icon" : @"lufy.png", @"age" : @20 };
建立模型User,User.h中代码如下:
@interface User : NSObject @property (copy, nonatomic) NSString *name; @property (copy, nonatomic) NSString *icon; @property (assign, nonatomic) int age; +(instancetype)accountWithDict:(NSDictionary *)dic; @end
User.m中代码如下:
// 使用KVC 字典转模型 如此方便,省去了大量的赋值代码 +(instancetype)accountWithDict:(NSDictionary *)dic { User *user = [[self alloc] init]; [user setValuesForKeysWithDictionary:dic]; return user; }
然后我们就可以直接利用User的类方法+(instancetype)accountWithDict:(NSDictionary *)dic来实现字典转模型。
2.利用第三方框架MJExtension(建议使用)
MJExtension is a fast, convenient and nonintrusive conversion between JSON and model.
MJExtension是一个转换速度快、使用简单方便的字典转模型框架
使用前先将MJExtensionExample/MJExtensionExample/MJExtension文件夹中的所有源代码拽入项目中
导入主头文件:#import "MJExtension.h" MJExtension.h MJConst.h MJConst.m MJFoundation.h MJFoundation.m MJIvar.h MJIvar.m MJType.h MJType.m NSObject+MJCoding.h NSObject+MJCoding.m NSObject+MJIvar.h NSObject+MJIvar.m NSObject+MJKeyValue.h NSObject+MJKeyValue.m
(1)最简单的字典转模型
typedef enum { SexMale, SexFemale } Sex; @interface User : NSObject @property (copy, nonatomic) NSString *name; @property (copy, nonatomic) NSString *icon; @property (assign, nonatomic) unsigned int age; @property (copy, nonatomic) NSString *height; @property (strong, nonatomic) NSNumber *money; @property (assign, nonatomic) Sex sex; @property (assign, nonatomic, getter=isGay) BOOL gay; @end /***********************************************/ NSDictionary *dict = @{ @"name" : @"Jack", @"icon" : @"lufy.png", @"age" : @20, @"height" : @"1.55", @"money" : @100.9, @"sex" : @(SexFemale), @"gay" : @"true" // @"gay" : @"1" // @"gay" : @"NO" }; // JSON -> User User *user = [User mj_objectWithKeyValues:dict]; NSLog(@"name=%@, icon=%@, age=%zd, height=%@, money=%@, sex=%d, gay=%d", user.name, user.icon, user.age, user.height, user.money, user.sex, user.gay); // name=Jack, icon=lufy.png, age=20, height=1.550000, money=100.9, sex=1
(2)模型中嵌套模型
@interface Status : NSObject @property (copy, nonatomic) NSString *text; @property (strong, nonatomic) User *user; @property (strong, nonatomic) Status *retweetedStatus; @end /***********************************************/ NSDictionary *dict = @{ @"text" : @"Agree!Nice weather!", @"user" : @{ @"name" : @"Jack", @"icon" : @"lufy.png" }, @"retweetedStatus" : @{ @"text" : @"Nice weather!", @"user" : @{ @"name" : @"Rose", @"icon" : @"nami.png" } } }; // JSON -> Status Status *status = [Status mj_objectWithKeyValues:dict]; NSString *text = status.text; NSString *name = status.user.name; NSString *icon = status.user.icon; NSLog(@"text=%@, name=%@, icon=%@", text, name, icon); // text=Agree!Nice weather!, name=Jack, icon=lufy.png NSString *text2 = status.retweetedStatus.text; NSString *name2 = status.retweetedStatus.user.name; NSString *icon2 = status.retweetedStatus.user.icon; NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2); // text2=Nice weather!, name2=Rose, icon2=nami.png
(3)模型中有个数组属性,数组里面又要装着其他模型
@interface Ad : NSObject @property (copy, nonatomic) NSString *image; @property (copy, nonatomic) NSString *url; @end @interface StatusResult : NSObject /** Contatins status model */ @property (strong, nonatomic) NSMutableArray *statuses; /** Contatins ad model */ @property (strong, nonatomic) NSArray *ads; @property (strong, nonatomic) NSNumber *totalNumber; @end /***********************************************/ // Tell MJExtension what type model will be contained in statuses and ads. [StatusResult mj_setupObjectClassInArray:^NSDictionary *{ return @{ @"statuses" : @"Status", // @"statuses" : [Status class], @"ads" : @"Ad" // @"ads" : [Ad class] }; }]; // Equals: StatusResult.m implements +mj_objectClassInArray method. NSDictionary *dict = @{ @"statuses" : @[ @{ @"text" : @"Nice weather!", @"user" : @{ @"name" : @"Rose", @"icon" : @"nami.png" } }, @{ @"text" : @"Go camping tomorrow!", @"user" : @{ @"name" : @"Jack", @"icon" : @"lufy.png" } } ], @"ads" : @[ @{ @"image" : @"ad01.png", @"url" : @"http://www.ad01.com" }, @{ @"image" : @"ad02.png", @"url" : @"http://www.ad02.com" } ], @"totalNumber" : @"2014" }; // JSON -> StatusResult StatusResult *result = [StatusResult mj_objectWithKeyValues:dict]; NSLog(@"totalNumber=%@", result.totalNumber); // totalNumber=2014 // Printing for (Status *status in result.statuses) { NSString *text = status.text; NSString *name = status.user.name; NSString *icon = status.user.icon; NSLog(@"text=%@, name=%@, icon=%@", text, name, icon); } // text=Nice weather!, name=Rose, icon=nami.png // text=Go camping tomorrow!, name=Jack, icon=lufy.png // Printing for (Ad *ad in result.ads) { NSLog(@"image=%@, url=%@", ad.image, ad.url); } // image=ad01.png, url=http://www.ad01.com // image=ad02.png, url=http://www.ad02.com
(4)模型中的属性名和字典中的key不相同(或者需要多级映射)
@interface Bag : NSObject @property (copy, nonatomic) NSString *name; @property (assign, nonatomic) double price; @end @interface Student : NSObject @property (copy, nonatomic) NSString *ID; @property (copy, nonatomic) NSString *desc; @property (copy, nonatomic) NSString *nowName; @property (copy, nonatomic) NSString *oldName; @property (copy, nonatomic) NSString *nameChangedTime; @property (strong, nonatomic) Bag *bag; @end /***********************************************/ // How to map [Student mj_setupReplacedKeyFromPropertyName:^NSDictionary *{ return @{ @"ID" : @"id", @"desc" : @"desciption", @"oldName" : @"name.oldName", @"nowName" : @"name.newName", @"nameChangedTime" : @"name.info[1].nameChangedTime", @"bag" : @"other.bag" }; }]; // Equals: Student.m implements +mj_replacedKeyFromPropertyName method. NSDictionary *dict = @{ @"id" : @"20", @"desciption" : @"kids", @"name" : @{ @"newName" : @"lufy", @"oldName" : @"kitty", @"info" : @[ @"test-data", @{ @"nameChangedTime" : @"2013-08" } ] }, @"other" : @{ @"bag" : @{ @"name" : @"a red bag", @"price" : @100.7 } } }; // JSON -> Student Student *stu = [Student mj_objectWithKeyValues:dict]; // Printing NSLog(@"ID=%@, desc=%@, oldName=%@, nowName=%@, nameChangedTime=%@", stu.ID, stu.desc, stu.oldName, stu.nowName, stu.nameChangedTime); // ID=20, desc=kids, oldName=kitty, nowName=lufy, nameChangedTime=2013-08 NSLog(@"bagName=%@, bagPrice=%f", stu.bag.name, stu.bag.price); // bagName=a red bag, bagPrice=100.700000
(5)将一个字典数组转成模型数组
NSArray *dictArray = @[ @{ @"name" : @"Jack", @"icon" : @"lufy.png" }, @{ @"name" : @"Rose", @"icon" : @"nami.png" } ]; // JSON array -> User array NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray]; // Printing for (User *user in userArray) { NSLog(@"name=%@, icon=%@", user.name, user.icon); } // name=Jack, icon=lufy.png // name=Rose, icon=nami.png
(6)将一个模型转成字典
// New model User *user = [[User alloc] init]; user.name = @"Jack"; user.icon = @"lufy.png"; Status *status = [[Status alloc] init]; status.user = user; status.text = @"Nice mood!"; // Status -> JSON NSDictionary *statusDict = status.mj_keyValues; NSLog(@"%@", statusDict); /* { text = "Nice mood!"; user = { icon = "lufy.png"; name = Jack; }; } */ // More complex situation Student *stu = [[Student alloc] init]; stu.ID = @"123"; stu.oldName = @"rose"; stu.nowName = @"jack"; stu.desc = @"handsome"; stu.nameChangedTime = @"2018-09-08"; Bag *bag = [[Bag alloc] init]; bag.name = @"a red bag"; bag.price = 205; stu.bag = bag; NSDictionary *stuDict = stu.mj_keyValues; NSLog(@"%@", stuDict); /* { ID = 123; bag = { name = "\U5c0f\U4e66\U5305"; price = 205; }; desc = handsome; nameChangedTime = "2018-09-08"; nowName = jack; oldName = rose; } */
(7)将一个模型数组转成字典数组
// New model array User *user1 = [[User alloc] init]; user1.name = @"Jack"; user1.icon = @"lufy.png"; User *user2 = [[User alloc] init]; user2.name = @"Rose"; user2.icon = @"nami.png"; NSArray *userArray = @[user1, user2]; // Model array -> JSON array NSArray *dictArray = [User mj_keyValuesArrayWithObjectArray:userArray]; NSLog(@"%@", dictArray); /* ( { icon = "lufy.png"; name = Jack; }, { icon = "nami.png"; name = Rose; } ) */
相关文章推荐
- 【网络编程】Linux多播简单实现
- OKHttp学习笔记
- Http协议中常用字段总结(不定时完善中)
- linux基础(31)--网络管理命令--RHEL6.5
- 日志切割工具cronolog详解
- linux命令之tcpdump
- linux基础(30)--网络管理基础--RHEL6.5
- 渐行渐远的分答
- TCP 三次握手 长连接/短连接
- Http 和Https 简单分析
- 网络爬虫Java实现抓取网页内容
- libnet、libnids、libpcap轻松搭建Linux网络入侵检测系统
- 计算机网络(一)带宽
- OSI七层与TCP/IP五层网络架构详解
- 在JAVA中使用NIO进行网络编程
- 大型网络游戏服务器的框架设计
- note05-计算机网络
- 使用httpclient发送post请求与get请求
- HttpServletResponse对象(二)
- 刷新神经网络新深度:ImageNet计算机视觉挑战赛微软中国研究员夺冠