iOS 【网端数据解析 JSON(MJExtension)& XML(NSXMLParser/GDataParser)】

来源:互联网 发布:荣耀三九年 知乎 编辑:程序博客网 时间:2024/06/05 16:02

截取案例中请求数据的部分,以加载成功模型数组self.videos为准。

① JSON 解析 —— MJExtension

- (void)getData {    // 请求数据JSON解析,并保存到模型数组中    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/video?type=JSON"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {                //        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); // 检查结果为字典        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];        //        NSLog(@"%@", dict);                NSArray *arr = dict[@"videos"];                // 将模型中的ID属性用id替换一下        [WZYVideo mj_setupReplacedKeyFromPropertyName:^NSDictionary *{            return @{@"ID" : @"id"};        }];                self.videos = [WZYVideo mj_objectArrayWithKeyValuesArray:arr];                dispatch_async(dispatch_get_main_queue(), ^{            [self.tableView reloadData];        });            }] resume];}


② XML 解析 —— NSXMLParser(系统自带的解析XML的类)

- (void)getData {    // 请求数据JSON解析,并保存到模型数组中    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {                        // XML解析(XML和JSON在本质上就是字符串,带有特殊格式的字符串)        // 1 创建解析器        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];        // 2 设置delegate        parser.delegate = self;        // 3 开始解析        [parser parse];                dispatch_async(dispatch_get_main_queue(), ^{            [self.tableView reloadData];        });            }] resume];}
该方法需要配合 NSXMLParserDelegate 一起使用
#pragma mark - NSXMLParserDelegate//01 开始解析XML文档的时候调用- (void)parserDidStartDocument:(NSXMLParser *)parser {        NSLog(@"parserDidStartDocument---开始解析XML文档");}//02 开始解析某个元素的时候调用 该方法会调用多次- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {        NSLog(@"didStartElement---开始解析单个元素---%@, %@", elementName, attributeDict);            if ([elementName isEqualToString:@"videos"]) {        return;    }        //01 把字典转换为模型    WZYVideo *video = [WZYVideo mj_objectWithKeyValues:attributeDict];        //02 把模型添加到数组    [self.videos addObject:video];}//03 某个元素解析完毕的时候调用  该方法会调用多次-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{    NSLog(@"didEndElement---单个元素解析完毕");}//04 整个XML文档解析完毕的时候调用-(void)parserDidEndDocument:(NSXMLParser *)parser{    NSLog(@"parserDidEndDocument---整个XML文档解析完毕");    //    dispatch_async(dispatch_get_main_queue(), ^{//        [self.tableView reloadData];//    });}

③ XML 解析 —— GDataParser(Google 开发的一款框架)

如果使用此第三方框架,需要进行一些配置:


(1)GDataXML 框架是MRC的,所以还需要告诉编译器以MRC的方式处理GDataXML的代码



(2)设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)



(3)设置链接参数(自动链接libxml2库)



- (void)getData {    // 请求数据XML解析,并保存到模型数组中    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {                //GDataXML来解析数据        //01 加载整个XML文档        GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];                //02 得到根元素 根据根元素得到内部所有名称为video的子元素(返回一个数组)        NSArray *eles = [doc.rootElement elementsForName:@"video"];                //03 遍历所有的子元素,得到子元素中的属性        for (GDataXMLElement *ele in eles) {                        WZYVideo *video = [[WZYVideo alloc]init];            video.ID = [ele attributeForName:@"id"].stringValue;            video.image = [ele attributeForName:@"image"].stringValue;            video.length = [ele attributeForName:@"length"].stringValue;            video.name = [ele attributeForName:@"name"].stringValue;            video.url = [ele attributeForName:@"url"].stringValue;                        [self.videos addObject:video];                    }                dispatch_async(dispatch_get_main_queue(), ^{            [self.tableView reloadData];        });            }] resume];}



4 0
原创粉丝点击