iOS网络编程 - 4

上篇讲到简单的封装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 服务器失败.");
                
            }];





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值