天天看点

Objective-C数据解析

Objective-C数据解析主要是json解析和xml解析,我们拿到的大部分还是json形式的。

json的数据形式直观易阅读,比较轻量级,一个student数据类型的json形式如下:

[

{"name":"张三", "gender":"不详", "age":"23", "hobby":"张鹏飞"},
{"name":"赵四", "gender":"男", "age":"24", "hobby":"音乐"},
{"name":"龙五", "gender":"男", "age":"17", "hobby":"学习"},
{"name":"李六", "gender":"男", "age":"21", "hobby":"玩游戏"},
{"name":"刘七", "gender":"男", "age":"23", "hobby":"篮球"},
{"name":"王八", "gender":"男", "age":"20", "hobby":"挤公交"}

]
           

我们将以上数据写到一个名为JSONInfoForStudent的txt文件中并在xcode中创建一个Student类。Foundation框架的解析方法用的是NSJSONSerialization这个类:

//1.创建文件路径
    NSString *path = [[NSBundle mainBundle]pathForResource:@"JSONInfoForStudent" ofType:@"txt"];
    //2.创建data对象
    NSData *data = [NSData dataWithContentsOfFile:path];
    //3.解析
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

    //把解析出来的数据封装成我们需要的model数据
    _array = [[NSMutableArray alloc]initWithCapacity:];
    for (NSDictionary *dict in array) {
        Student *student = [Student new];
        [student setValuesForKeysWithDictionary:dict];
        [_array addObject:student];
    }

    for (Student *student in _array) {
        NSLog(@"%@", student);
    }
           

也可以用第三方解析,如JSONKit:

//1.创建路径
    NSString *path = [[NSBundle mainBundle]pathForResource:@"JSONInfoForStudent" ofType:@"txt"];
    //2.创建data对象
    NSData *data = [NSData dataWithContentsOfFile:path];
    //3.解析
    NSArray *array = [data objectFromJSONData];

    //把解析出来的数据封装成我们需要的model数据
    _array = [[NSMutableArray alloc]initWithCapacity:];
    for (NSDictionary *dict in array) {
        Student *student = [Student new];
        [student setValuesForKeysWithDictionary:dict];
        [_array addObject:student];
    }

    for (Student *student in _array) {
        NSLog(@"%@", student);
    }
           

XML是一种可扩展的语言,也被广泛用于数据交换和web服务,其特点是成对的标签,一个student数据类型的json形式如下:

<students>


<student>
    <name>张三</name>
    <gender>男</gender>
    <age>22</age>
    <hobby>玩游戏</hobby>
</student>

<student>
    <name>赵四</name>
    <gender>男</gender>
    <age>21</age>
    <hobby>看电影</hobby>
</student>

<student>
    <name>龙五</name>
    <gender>男</gender>
    <age>23</age>
    <hobby>打篮球</hobby>
</student>

<student>
    <name>李六</name>
    <gender>女</gender>
    <age>18</age>
    <hobby>旅游</hobby>
</student>

<student>
    <name>刘七</name>
    <gender>女</gender>
    <age>18</age>
    <hobby>学习</hobby>
</student>

<student>
    <name>王八</name>
    <gender>男</gender>
    <age>23</age>
    <hobby>吃</hobby>
</student>




</students>
           

我们将以上数据写到一个名为XMLStudentInfo的txt文件中并在xcode中创建一个Student类。Foundation框架的解析方法用的是NSXMLParser这个类:

//1.创建文件路径
    NSString *path = [[NSBundle mainBundle]pathForResource:@"XMLStudentInfo" ofType:@"txt"];
    //2.创建data对象
    NSData *data = [NSData dataWithContentsOfFile:path];
    //3.创建解析对象
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    //4.设置解析代理,遵循NSXMLParserDelegate协议
    parser.delegate = self;
    //5.开始解析
    [parser parse];
           

解析过程在代理方法中执行:

//1.开始文档解析
- (void)parserDidStartDocument:(NSXMLParser *)parser{

    NSLog(@"我要开始解析了!");
    //筹备容器盛放数据
    _array = [[NSMutableArray alloc]initWithCapacity:];

}
//2.开始节点解析
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

    //存储当前节点
    _currentElement = elementName;
    //判断是否是student节点,如果是,开始创建student的model对象
    if ([elementName isEqualToString:@"student"]) {
        Student *student = [Student new];
        [_array addObject:student];
    }
}

//3.获取标签内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    //思考:为什么是数组最后一个元素
    Student *student = [_array lastObject];
    //KVC
    [student setValue:string forKey:_currentElement];
}
//4.结束节点解析
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    _currentElement = nil;
}
//5.结束文档解析
- (void)parserDidEndDocument:(NSXMLParser *)parser{
    //查看是否解析成功
    for (Student *student in _array) {
        NSLog(@"%@", student);
    }
}
//6.错误报告
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
    //根据错误来调试
    NSLog(@"你代码写错了!错误是%@", parseError);
}
           

OC中常用的XML解析第三方是GDataXMLNode,使用很方便:

//1.创建文件路径
    NSString *path = [[NSBundle mainBundle]pathForResource:@"XMLStudentInfo" ofType:@"txt"];
    //2.创建data对象
    NSData *data = [NSData dataWithContentsOfFile:path];
    //3.创建解析对象
    GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options: error:nil];
    //4.获取根节点
    GDataXMLElement *rootElement = document.rootElement;

    //解析
    //准备数组
    _array = [[NSMutableArray alloc]initWithCapacity:];

    for (GDataXMLElement *subElement in rootElement.children) {

        Student *student = [Student new];

        for (GDataXMLElement *element in subElement.children) {

            [student setValue:element.stringValue forKey:element.name];

        }
        [_array addObject:student];
    }
    for (Student *student in _array) {
        NSLog(@"%@", student);
    }
           

解析过程中我们设计到了数据模型的转换,iOS的模型框架其实有很多,如JSONModel、YYModel、MJExtension和Mantle,使用很简单,大家可以自行看一看。