1 數據解析
在iOS開發中,常見的數據傳輸格式有兩種:JSON和XML。目前JSON由于其體積小、傳輸速度快等優點,逐漸成為了主流的數據傳輸格式。
2 JSON
在iOS中,JSON的常見解析方法有四種。
第三方框架:
JSONKit、SBJSON、TouchJSON(性能從做往右,越來越差)
蘋果原生:
NSJSONSerialization (性能是最好的,解析推薦使用原生的框架)
下面的表格是JSON的數據格式與OC對象之間的對照表,可以互相轉換。
JSON數據格式 | OC對象 |
---|---|
{...} | NSDictionary |
[...] | NSArray |
12 | NSNumber |
2.1 JSON轉成OC對象
方法
- 返回值:OC對象,JSON格式的最外層數據結構對象的OC對象
- data : 二進制的JSON數據
- options:選項,任選一個即可。
-
error:錯誤信息
//類方法 (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
eg: {quot;successquot;:quot;用戶名密碼正確,成功登陸quot;}
//①序列化json對象 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; //②根據字典的屬性,獲取相應的內容 NSString *str = dict[@quot;successquot;];
2.2 OC對象轉換成JSON數據
方法
- 返回值:返回JSON二進制數據
- id :OC對象
- option:只有一個值,隨便寫
-
error :錯誤信息
//類方法 (NSData *)dataWithJSONObject:lt;#(nonnull id)#gt; options:lt;#(NSJSONWritingOptions)#gt; error:lt;#(NSError * _Nullable __autoreleasing * _Nullable)#gt;
轉換成的二進制JSON數據可以直接發往服務器
3 XML
XML(可擴展標記語言),是一種數據交互格式。
3.1 文檔格式
一個完整的XML文檔包含:文檔聲明 元素 屬性
#文檔聲明
lt;?xml version=quot;1.0quot; encoding=quot;UTF-8quot; ?gt;
#元素
- 一個語言包含了開始標簽 結束標簽
- 元素沒有內容也可以
- 元素能夠嵌套,但不能交叉嵌套
- 所有的空格和換行都作為內容處理
3.2 解析方式
XML的解析包含兩種方式:SAX方式解析和DOM方式解析
(1)SAX
從根節點開始,挨個裝進內存,適合大文件解析
(2)DOM
整個文檔裝進內存,適合解析小文件
目前針對XML的解析,有相應的解析框架
- GDataXML:谷歌開發,基于libxml,DOM解析
- libxml:純C語言,第三方框架,可以SAX、DOM解析
- NSXMLParser:蘋果原生框架,SAX方式解析
3.3 GDataXML(DOM方式)
解析步驟
(1)
(2)加載xml的二進制數據----GDataXMLDocument
(3)找到根節點----GDataXMLElement
(4)根據子節點名稱找到根節點的子節點 ---- GDataXMLElement
(5)獲取屬性值或者節點的內容 ----attributeWithName 或者 stringValue
添加框架
第一次使用GDataXML需要添加框架以及動態庫,詳見圖片
(1)添加動態庫 libxml
(2)導入鏈接文件
(3)修改ARC
解析舉例
xml文件如下:
lt;?xml version=quot;1.0quot; encoding=quot;UTF-8quot; ?gt; lt;rootgt; lt;person id=quot;p1quot;gt; lt;namegt;Tomlt;/namegt; lt;agegt;24lt;/agegt; lt;/persongt; lt;person id=quot;p2quot;gt; lt;namegt;Lucylt;/namegt; lt;agegt;22lt;/agegt; lt;/persongt; lt;/rootgt;
解析代碼
//1 獲取xml文件 NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@quot;person.xmlquot; ofType:nil]]; //2 加載xml文件準備解析--內存中 GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:(XML_PARSE_NOCDATA | XML_PARSE_NOBLANKS) error:nil]; //3 獲取根節點 GDataXMLElement *root = [document rootElement]; //4 根據根節點 以及子節點的名稱 找到其子節點的數組 NSArray *childArray = [root elementsForName:@quot;personquot;]; //5 遍歷數組 for (GDataXMLElement *person in childArray) { //5.1 根據屬性名稱獲取屬性值 GDataXMLNode *personIDNode = [person attributeForName:@quot;idquot;]; NSString *personID = [personIDNode stringValue]; //5.2 根據節點名稱,繼續獲取子節點-name,取數組的第一個值 GDataXMLElement *nameElement = [person elementsForName:@quot;namequot;][0]; NSString *name = [nameElement stringValue]; //5.3 根據節點名稱,繼續獲取子節點-age GDataXMLElement *ageElement = [person elementsForName:@quot;agequot;][0]; NSString *age = [ageElement stringValue]; //5.4 打印 NSLog(@quot;name=%@,age=%@quot;,name,age); }
Tags: JSON XML iOS開發
文章來源:http://www.jianshu.com/p/c2fd2982c248