JSON
什麼是 JSON:
JSON 是一種輕量級的資料格式,一般用于資料互動;
伺服器傳回給用戶端的資料,一般都是 JSON 格式或者 XML 格式(檔案下載下傳除外)
JSON 的格式很像 OC 中的字典和數組
{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}
标準 JSON 格式的注意點:key 必須用雙引号
要想從 JSON 中挖掘出具體資料,得對 JSON 進行解析。把原有的 JSON 轉換為 OC 資料類型;
JSON – OC 轉換對照表

JSON – OC 轉換練習
JSON 轉 OC
JSON 解析方案
在 iOS 中,JSON 的常見解析方案有幾種?
4 種;
- 第三方架構:
- JSONKit
- SBJson
- TouchJSON(性能從上到下,越差)
- 蘋果原生(自帶):
- NSJSONSerialization(性能最好)
NSJSONSerialization 的常見方法:
- JSON資料 > OC對象
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
- OC對象 > JSON資料
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
解析來自伺服器的 JSON
XML
什麼是 XML?
全稱是 Extensible Markup Language,譯作“可擴充标記語言”。跟 JSON 一樣,也是常用的一種用于互動的資料格式。一般也叫 XML 文檔(XML Document)
XML 舉例
<videos>
<video name="小黃人 第01部" length="30" />
<video name="小黃人 第02部" length="19" />
<video name="小黃人 第03部" length="33" />
</videos>
XML 文法
一個常見的 XML 文檔一般由以下部分組成:
- 文檔聲明
- 在 XML 文檔的最前面,必須編寫一個文檔聲明,用來聲明 XML 文檔的類型;
-
最簡單的聲明
<?xml version="1.0" ?>
-
用 encoding 屬性說明文檔的字元編碼
<?xml version="1.0" encoding="UTF-8" ?>
-
- 在 XML 文檔的最前面,必須編寫一個文檔聲明,用來聲明 XML 文檔的類型;
- 元素(Element)
- 一個元素包括了開始标簽和結束标簽;
- 擁有内容的元素:<video>小黃人</video>
- 沒有内容的元素:<video></video>
- 沒有内容的元素簡寫:<video/>
- 一個元素可以嵌套若幹個子元素(不能出現交叉嵌套)
<videos> <video> <name>小黃人 第01部</name> <length>30</length> </video> </videos>
- 一個元素包括了開始标簽和結束标簽;
- 規範的 XML 文檔最多隻有 1 個根元素,其他元素都是根元素的子孫元素
注意
- XML 中的所有空格和換行,都會當做具體内容處理
- 下面兩個元素的内容是不一樣的
- 第1個
<video>小黃人</video>
- 第2個
<video> 小黃人 </video>
- 下面兩個元素的内容是不一樣的
- 屬性(Attribute)
- 一個元素可以擁有多個屬性
<video name="小黃人 第01部" length="30" />
- video 元素擁有 name 和 length 兩個屬性
- 屬性值必須用雙引号" " 或者單引号' ' 包覆
- 實際上,屬性表示的資訊也可以用子元素來表示,比如
<video>
<name>小黃人 第01部</name>
<length>30</length>
</video>
XML 解析
- 要想從 XML 中提取有用的資訊,必須得學會解析 XML
- 提取 name 元素裡面的内容
<name>小黃人 第01部</name>
- 提取 video 元素中 name 和 length 屬性的值
<video name="小黃人 第01部" length="30" />
XML 的解析方式有幾種?
有一下 2 種:
- DOM:一次性将整個XML文檔加載進記憶體,比較适合解析小檔案
- SAX:從根元素開始,按順序一個元素一個元素往下解析,比較适合解析大檔案
iOS 中的 XML 解析
- 在 iOS 中,解析 XML 的手段有很多
- 蘋果原生
- NSXMLParser:SAX方式解析,使用簡單;
- 第三方架構
- libxml2:純 C 語言,預設包含在 iOS SDK 中,同時支援 DOM 和 SAX 方式解析;
- GDataXML:DOM 方式解析,由 Google 開發,基于 libxml2;
- 蘋果原生
- XML 解析方式的選擇建議
- 大檔案:NSXMLParser、libxml2
- 小檔案:GDataXML、NSXMLParser、libxml2
NSXMLParser
- 使用步驟:
// 傳入 XML 資料,建立解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 設定代理,監聽解析過程
parser.delegate = self;
// 開始解析
[parser parse];
- NSXMLParser 采取的是 SAX 方式解析,特點是事件驅動,下面情況都會通知代理;
- 當掃描到文檔(Document)的開始與結束;
- 當掃描到元素(Element)的開始與結束;
NSXMLParserDelegate
- 當掃描到文檔的開始時調用(開始解析)
- (void)parserDidStartDocument:(NSXMLParser *)parser
- 當掃描到文檔的結束時調用(解析完畢)
- (void)parserDidEndDocument:(NSXMLParser *)parser
- 當掃描到元素的開始時調用(attributeDict存放着元素的屬性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
- 當掃描到元素的結束時調用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
GDataXML
GDataXML 配置
- GDataXML 基于 libxml2 庫,得做以下配置
- 導入 libxml2 庫
JSON 和 XMLJSONXMLGDataXML -
設定 libxml2 的頭檔案搜尋路徑(為了能找到libxml2庫的所有頭檔案)
在 Head Search Path 中加入 /usr/include/libxml2
-
設定連結參數(自動連結 libxml2 庫)
在 Other Linker Flags 中加入 -lxml2
- 導入 libxml2 庫
- 由于 GDataXML 是非 ARC 的,是以得設定編譯參數
設定編譯參數
GDataXML 使用
- GDataXML 中常用的類:
- GDataXMLDocument:代表整個 XML 文檔;
- GDataXMLElement
-
代表文檔中的每個元素;
-使用 attributeForName: 方法可以獲得屬性值;
-
JSON 和 XML 比較
- 同一份資料,既可以用 JSON 來表示,也可以用 XML 來表示;
- 相比之下,JSON 的體積小于 XML,是以伺服器傳回給移動端的資料格式以JSON 居多;
JSON 和 XMLJSONXMLGDataXML