您的位置:首页 > 理论基础 > 计算机网络

iOS网络-02-数据解析(JSON与XML)

2015-08-19 12:55 585 查看

数据交互格式

服务器返回给用户的数据,通常是以下两种方式:

JSON

XML

JSON

一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式

用使用JSON文件中的数据,需要对其进行解析,苹果的NSJSONSerialization解析性能最好

iOS中的JSON文件解析,是将其转换成OC对象,如下:

大括号{} --> 字典NSDictionary

中括号[] --> 数组NSArray

双引号"" --> 字符串NSString

数字 --> NSNumber

JSON通常使用NSJSONSerialization进行解析,性能最好

XML

XML(Extension Markup Language),可扩展标记语言

是服务器返回客户端常用的一种数据格式

XML文档,通常包含以下内容

文档声明

元素(element)

属性(attribute)

XML文档的解析方案

小文件:NSXMLParser苹,果原生

大文件:GDataXML,Google开发,基于libxml2

JSON解析

解析类型

默认解析NSDictionary与NSArray类型的数据

若要解析NSString类型的数据,需要使用NSJSONReadingAllowFragments参数

一个对象通常要遵循以下规则才能转换成JSON文档

根节点是NSDictionary或NSArray类型

所有的对象必须是NSString、NSNumber、NSArray、NSDictionary或NSNull中的一种

对象个数有限

JSON数据与OC对象的转化

JSON --> OC

+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error
/**
* data:需要解析的NSData类型数据
* opt:解析方式
* error:错误信息
*/


OC --> Json

+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error
/**
* obj:需要转换的OC对象
* opt:解析方式
* error:错误信息
*/


解析NSString

NSString *json = "I am a coder";
[NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil]
/**
* JSON解析的数据通常是使用NSUTF8StringEncoding编码的NSData类型数据
* options:指定可以解析的类型,NSJSONReadingAllowFragments表示可以解析   NSString对象
* error:返回解析错误信息
* 返回值为解析完成的NSString对象
*/


解析NSDictionary与NSArray(来自服务器的数据)

/**Block的方式发送请求*/
//创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:(此处为请求路径)];
//发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
}];
/**
* queue:请求任务所在的队列
* completionHandler:请求完成回调的Block
* response:服务器的响应信息
* data:服务器返回的数据
* error:错误信息
* 将data解析成对应的NSDictionary对象
*/


XML解析

小文件解析(NSXMLParser)

通过NSXMLParser解析XML文档,需要用到代理协议NSXMLParserDelegate

NSXMLParserDelegate协议的常用方法

// 1. 开始解析XML文档的时候调用
- (void)parserDidStartDocument:(NSXMLParser *)parser
// 2. 解析到XML文档中某个元素的开始的时候调用,解析任务的核心
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict
/**
* elementName:正在解析的元素的名字
* attributeDict:解析生成的OC对象
*/
// 3. 解析到XML文档中某个元素的结束的时候调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
// 4. 解析到XML文档结尾的时候调用
- (void)parserDidEndDocument:(NSXMLParser *)parser


解析步骤

// 1. 创建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 2. 设置代理
parser.delegate = self;
// 3. 启动解析器
[parser parse];
// 4. 在代理方法中完成具体的解析任务


大文件解析(GDataXML)

与GDataXML相关的几个类

GDataXMLDocument,整个XML文档

GDataXMLElement,XML文档中的一个元素

解析步骤

// 1. 将XML文档数据,转换成GDataXMLDocument类型的对象
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 2. 获取GDataXMLDocument对象中根节点的所有元素
NSArray *elements = [document.rootElement elementsForName:@"此处为元素的名字"];
/**
* 获取XML文档中指定名字的所有元素
*/
// 3. 解析每个元素中的数据
for (GDataXMLElement *ele in elements)
{
[ele attributeForName:@"此处为元素中的Key"].stringValue;
/**
* 解析元素ele中键值为Key的属性值,将其转化为字符串对象
*/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: