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的属性值,将其转化为字符串对象 */ }
相关文章推荐
- HttpClient post 请求实例
- Python入门网络爬虫之精华版
- 【转】 VC中TCP实现 异步套接字编程的原理+代码
- Linux————TCP/IP协议
- iOS网络-01-NSURLRequest与NSURLConnection
- 网络爬虫简单原理
- httpclient模拟登陆,不支持https的问题
- 网络测试Ping命令
- TCP 第三次握手失败
- 用HttpClient上传图片
- httpClient使用中报错org.apache.commons.httpclient.HttpMethodBase - Going to buffer response body of large or unknown size.
- Base64编码在网络图片传输中的应用实例
- 如何从一台客户机向服务机发起40亿TCP长连接?
- 分享体积小巧,功能强大的网络嗅探和分析工具SnifferView 版本-1.0.0.25
- ios开发判断网络连接及网络异常(ios自学笔记)
- Qt网络获取外网的网络信息
- UVA 10594-Date Flow(无向图的最小费用网络流+题目给的数据有误)
- 利用HttpURLConnection下载文件的核心代码代码
- Tomcat HTTPS
- TCP和UDP的区别(转)