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,使用很简单,大家可以自行看一看。