上篇讲到简单的封装AFNetworking 的使用,这里讲解请求成功之后我们得到服务器的数据,是,什么,该怎么解析?
首先来看看,是什么,我们举例Coding的例子,当程序启动第一个返回的数据是:
api/wallpaper/wallpapers:
{
code = 0;
data = (
{
"created_at" = 1438946765000;
group = {
author = "Gerard Moonen";
"created_at" = 1438946658000;
description = "";
id = 17;
link = "";
name = Street;
status = 1;
"updated_at" = 1452678842000;
};
name = "Street-Gerard Moonen.jpg";
pixel = 1242x2208;
ratio = 8;
size = 933684;
status = 1;
type = 3;
"updated_at" = 1438946765000;
url = "https://dn-coding-net-production-static.qbox.me/f7667a06-e1c6-42ad-adf3-c08b45cbd85a.jpg";
},
{
"created_at" = 1438946991000;
group = {
author = "Gre\U0301goire Herve\U0301-Bazin";
"created_at" = 1438946929000;
description = "";
id = 18;
link = "https://images.unsplash.com/reserve/e66NHyUFQx6lNahLbW6g_IMG_2536_2.jpg?q=80&fm=jpg&s=1f06f3d2e5be4041a7ad9aade5dca0f2";
name = Brandung;
status = 1;
"updated_at" = 1438946929000;
};
name = "Brandung.jpg";
pixel = 1242x2208;
ratio = 8;
size = 1031235;
status = 1;
type = 3;
"updated_at" = 1438946991000;
url = "https://dn-coding-net-production-static.qbox.me/61dd77a1-72c9-448b-afcf-451c4414d957.jpg";
},
{
"created_at" = 1441952535000;
group = {
author = kazuend;
"created_at" = 1441952517000;
description = "";
id = 21;
link = "https://images.unsplash.com/photo-1436891620584-47fd0e565afb?q=80&fm=jpg&s=33cf5b0ee9fbd292475a0c03bee481c9";
name = "Night sky";
status = 0;
"updated_at" = 1441952517000;
};
name = "2.jpg";
pixel = 1242x2208;
ratio = 8;
size = 1229233;
status = 1;
type = 3;
"updated_at" = 1441952535000;
url = "https://dn-coding-net-production-static.qbox.me/e515b74b-3dbd-4140-a49d-d1548a4ce71c.jpg";
}
);
}
很明显是一个JSON数据(不懂的自己去学啦)
并且结构非常明显:data 和 code
其实就是一个常用的 返回数据,和请求结果状态,有些服务器还有带一个message服务器的返回信息
我们来看看怎么构造一个数据解析器,同理,我们这里用一个单例来构建:
这个单例类需要有外放的属性变量:状态码,消息,数据
并且因为服务器不一定会返回规范的JSON格式,我们需要有字典,数组,和一个id类型(包括NSString , NSData等)
@property (nonatomic, assign) NSInteger statusCode; //返回状态
@property (nonatomic, strong) NSString *message; //返回服务器消息提醒
@property (nonatomic, strong) NSDictionary *dataDic; //返回数据
@property (nonatomic, strong) NSArray *dataArr;
@property (nonatomic, strong) id dataObj;
还需要一个通用的解析方法:
- (void)parseResponseObject:(id)responseObject;
这样,我们的解析器就能获取了:
#import "LBResponseParser.h"
@implementation LBResponseParser
+ (LBResponseParser *)shareResponseManager{
static LBResponseParser *shareResponseParser = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareResponseParser = [[[self class] alloc] init];
});
return shareResponseParser;
}
- (void)parseResponseObject:(id)responseObject{
NSError *jsonErr = nil;
id jsonObject = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&jsonErr];
if (jsonErr) {
_statusCode = 1001;
NSLog(@"json parse error . %@", jsonErr);
return;
}
NSAssert([jsonObject isKindOfClass:[NSDictionary class]], @""); //断言判断是否正确
NSDictionary *jsonDic = (NSDictionary *)jsonObject;
_statusCode = [[jsonDic objectForKey:@"code"] integerValue];
_message = [jsonDic objectForKey:@"message"];
id data = [jsonDic objectForKey:@"data"];
if ([data isKindOfClass:[NSDictionary class]]) {
_dataDic = data;
} else if ([data isKindOfClass:[NSDictionary class]]){
_dataArr = data;
}else{
_dataObj = data;
}
}
@end
注意这个方法:
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
来自iOS原生的JSON解析类:
NSJSONSerialization 非常强大
这样我们就能完整地post请求一次服务器并且完成数据解析:
[[LBHTTPHelper shareHTTPHelper] postPath:LB_REQUEST_URL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject){
LBResponseParser *parser = [LBResponseParser shareResponseManager];
[parser parseResponseObject:responseObject];
if (parser.statusCode == 0) {
NSLog(@"post 服务器失败.");
}
NSLog(@"respose data :%@", parser.dataDic);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"post 服务器失败.");
}];