数据解析
- 在日常开发中,我们需要和服务端交互,传输数据的过程中就需要对服务端传输的数据进行解析
- 我们日常开发中最常用的就是json格式的数据,当然也有少部分是用xml的
- json格式的解析这里只提示系统提供的方法,至于第三方框架,这里不做介绍
json格式
- {} -> NSDictionary @{}
- [] -> NSArray @[]
- "" -> NSString @""
- 10 -> NSNumber @10
- 10.5 -> NSNumber @10.5
- true -> NSNumber @1
- false -> NSNumber @0
- null -> NSNull
/**
NSJSONReadingMutableContainers // 创建出来的数组和字典就是可变
NSJSONReadingMutableLeaves // 数组或者字典里面的字符串是可变的
NSJSONReadingAllowFragments // 允许解析出来的对象不是字典或者数组,比如直接是字符串或者NSNumber
*/
// 前面用什么容器接收,options使用那个枚举,这些都需要根据实际情况选择
// 如果不用关心容器是否可变,那么可以使用kNilOptions
[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
// OC对象转换成JSON对象
// obj是OC对象
[NSJSONSerialization dataWithJSONObject:obj options:NSJSONWritingPrettyPrinted error:nil];
XML解析
- XML解析有两种方法
- 苹果原生
- NSXMLParser:SAX方式解析,使用简单,适合大文件解析
- 第三方框架
- libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析
- GDataXML:DOM方式解析,基于libxml2,适合小文件解析
NSXMLParser
// 传入XML数据,创建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 设置代理,监听解析过程
parser.delegate = self;
// 开始解析
[parser parse];
// 当扫描到文档的开始时调用(开始解析)
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
}
// 开始解析节点“元素”
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
}
// 发现节点文本字符
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
}
// 结束节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
}
// 当扫描到文档的结束时调用(解析完毕)
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
}
// 解析错误
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
}
GDataXML
- 导入libxml2
- 在
Header Search Paths
加入/usr/include/libxml2
- 在
Other Linker Flags
中加入-lxml2
- 在
Build Phases
-> omplie Sources
中将GDataXMLNode.m
添加 -fno-objc-arc
// 加载整个文档
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 获得所有video元素
NSArray *elements = [doc.rootElement elementsForName:@"video"];
for (GDataXMLElement *ele in elements) {
YWVideo *video = [[YWVideo alloc] init];
video.name = [ele attributeForName:@"name"].stringValue;
// 类似的取出其他数据
// 添加到数组
[self.videos addObject:video];
}
网友评论