IOS 之 网络通信数据交换格式

在学习网络通信技术之前先来学习一下数据交换格式. 在Web Service的网络通信中有三种数据交换格式: 

1.纯文本格式 

纯文本的格式是一种简单的无格式的数据交换方式.

2.XML格式 

XML是一种自描述的数据交换格式.虽然不如JSON轻便,但是它有着严格的语法规则.解析XML文档时,目前有两种流行的模式:SAX和DOM, 

SAX模式是基于事件驱动的,只能读取XML文档.优点是速度快.

DOM模式将文档作为一棵树状结构进行分析,获取节点的内容以及相关属性,进行增删改.

IOS SDK提供了两个框架用来解析XML:

1.NSXML 它是基于OC语言的SAX解析框架,是IOS SDK默认的XML解析框架,不支持DOM模式.

2.libxml2  它是基于C语言的XML解析器,被苹果整合在IOS SDK中,不支持SAX和DOM模式.

以下是第三方框架:

1.TBXML 它是轻量级的DOM模式解析库,不支持XML文档验证和XPath,只能读取XML文档,不能写XML文档,但是解析XML最快的.

2.TouchXML 它是基于DOM模式的解析库,与TBXML类似,只能读取XML文档,不能写.

3.KissXML 它是基于DOM模式的解析库,基于TouchXML,主要的不同是可以写入

4.TinyXML 它是基于C++语言的DOM模式解析库,可以读写XML文档,不支持XPath.

5.GDataXML 它是基于DOM模式的解析库,由Google开发,可以读写XML文档,支持XPath查询.

从解析性能方面来看,NSXML和TBXMl都非常优秀,但是TBXML有点麻烦,而TBXML就简单多了.下面来看这两个的使用方法:

一.使用NXSML(SAX模式)

主要使用NSXMLParser类和NSXMLParserDelegate协议来解析.下面是5个常用方法.

parserDidStartDocument: 文档开始时触发

parser:didStartElement:namespaceURI:qualifiedName:attributes: 遇到一个开始标签时触发

parser:foundCharacters: 遇到字符串时触发

parser:didEndElement:namespaceURI:qualifiedName: 遇到结束标签时触发

parserDidEndDocument: 文档结束时触发

二.使用TBXML(DOM模式)

下载地址是http://github.com/71squared/TBXML  

技术支持网站 http://www.tbxml.co.uk/TBXML/TBXML_free.html. 下载完后需要添加到工程中.

因为TBXML不支持ARC,所以要修改TBXML的源代码,打开工程头文件*.pch添加以下宏 #define ARC_ENABLED. 

因为TBXML依赖libz.dylib库,还要在工程中添加这个库. 主要使用以下几个方法:

initWithXMLFile:error: 初始化文件

rootXMLELement 根节点

childElementNamed:parentElement: 根据父节点读取指定节点

valueOfAttributeName:forElement:error: 获取节点的属性

nextSiblingNamed:searchFromElement: 获取同层下一个元素,比如有两个"note"节点,那获取的就是下一个

3.JSON格式

JSON是一种轻量级的数据交换格式.意思就是字符少传输速度快.通常都是以键值对形式.

有很多框架可以使用,如下:

1.SBJson 它是比较老的JSON编码/解码,支持ARC 下载地址 https://github.com/stig/json-framework

2.TouchJSON 它也是比较老的,支持ARC和MRC 下载地址 https://github.com/TouchCode/TouchJSON

3.YAJL 它是比较优秀的JSON框架,基于SBJson进行了优化,底层API使用C编写,上层使用OC编写,不支持ARC 下载地址 http://lloyd.github.com/yajl

4.JSONKit 它是更为优秀的JSON框架,代码小,速度快,不支持ARC 下载地址 https//github.com/johnezang/JSONKit

5.NextiveJson 它是非常优秀的JSON框架,与JSONKit的性能差不多,但是在开源社区中没有JSONKit知名度高,不支持ARC 下载地址 https//github.com/nextive/NextiveJson

6.NSJSONSerialization 它是IOS 5之后苹果提供的API,是目前非常优秀的JSON框架,支持ARC. IOS 5以后的SDK包含有这个框架,不需要配置.

下边来介绍NSJSONSerialization使用方法,很简单.

[NSJSONSerialization JSONObjectWithData:options:error:] 解码

options 有三个可选:

NSJSONReadingMutableContainers 返回的是可变的数组或字典,如果以后需要修改结果就用这个.

NSJSONReadingMutableLeaves 指定叶节点是可变字符串

NSJSONReadingAllowFragments 指定顶级节点可以不是数组或字典

ios5中apple增加了解析JSON的api——NSJSONSerialization。网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON、TouchJSON、YAJL、JSONKit、NextiveJson。详情见这里。既然apple为我们提供了这么良好的工具,我们没理由不用吧。

  NSJSONSerialization提供了将JSON数据转换为Foundation对象(一般都是NSDictionary和NSArray)和Foundation对象转换为JSON数据(可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据)。

  下面提供一个从豆瓣电台下载的json数据转换的代码


[javascript] view plaincopy
  1. View Code   
  2.  
  3. #define kGlobalQueue    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)  
  4. #define kDoubanUrl      @"http://douban.fm/j/mine/playlist?type=n&h=&channel=0&from=mainsite&r=4941e23d79"  
  5. -(void) loadJsonData:(NSURL *)url  
  6. {  
  7.     dispatch_async(kGlobalQueue, ^{  
  8.         NSData *data = [NSData dataWithContentsOfURL:url];  
  9.         [self performSelectorOnMainThread:@selector(parseJsonData:) withObject:data waitUntilDone:NO];  
  10.     });  
  11. }  
  12. -(void) parseJsonData:(NSData *)data  
  13. {  
  14.     NSError *error;  
  15.     NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];  
  16.     if (json == nil) {  
  17.         NSLog(@"json parse failed \r\n");  
  18.         return;  
  19.     }  
  20.     NSArray *songArray = [json objectForKey:@"song"];  
  21.     NSLog(@"song collection: %@\r\n",songArray);  
  22.   
  23.     _song = songArray;  
  24.     self.songIndex = 0;  
  25.     NSDictionary *song = [songArray objectAtIndex:0];  
  26.     NSLog(@"song info: %@\t\n",song);  
  27. }  
Foundation对象转换为json数据
[javascript] view plaincopy
  1. View Code   
  2.   
  3. NSDictionary *song = [NSDictionary dictionaryWithObjectsAndKeys:@"i can fly",@"title",@"4012",@"length",@"Tom",@"Singer", nil];  
  4.     if ([NSJSONSerialization isValidJSONObject:song])  
  5.     {  
  6.         NSError *error;  
  7.         NSData *jsonData = [NSJSONSerialization dataWithJSONObject:song options:NSJSONWritingPrettyPrinted error:&error];  
  8.         NSString *json =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];  
  9.         NSLog(@"json data:%@",json);  
  10.     }  


经常用用就都熟悉了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值