/------------------------------------ 數(shù)據(jù)解析: 1.JSON數(shù)據(jù) --------------------------------/
{
1.JSON:是一種輕量級的傳輸數(shù)據(jù)格式,用于數(shù)據(jù)交互.
JSON是javascript語言的一個子集.javascript是個腳本語言(不需要編譯),用來給HTML增加動態(tài)功能.
javascript和java沒有半毛錢的關(guān)系!
服務(wù)器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XML格式(文件下載除外).
語法規(guī)則:
<1> 數(shù)據(jù)以鍵值的方式保存;
鍵(key)必須用雙引號("key"),與鍵值之間以':'分隔; {"name":"小明"}
<2> 數(shù)據(jù)和數(shù)據(jù)之間以逗號(,)分隔. {"name":"小明","age":13}
<3> {}表示對象. "person":{"name":"小明","age":13}
<4> []表示數(shù)組. "persons":[
{"name":"小明","age":13},
{"name":"小紅","age":14},
{"name":"小花","age":15}
]
2.JSON與OC轉(zhuǎn)換對照:
大括號 {} == NSDictionary;
中括號 [] == NSArray;
雙引號" " == NSString;
數(shù)字13,13.5 == NSNumber;
3.數(shù)據(jù)傳輸過程:
客戶端發(fā)送請求給服務(wù)器,服務(wù)器接收到客戶端的請求之后,返回給客戶端JSON數(shù)據(jù).
客戶端需要把服務(wù)器返回的JSON數(shù)據(jù)轉(zhuǎn)換為OC的數(shù)據(jù)格式(數(shù)組/字典等).
}
/------------------------------------ 數(shù)據(jù)解析: 2.JSON解析 --------------------------------/
{
1.JSON數(shù)據(jù)解析方法:
在iOS中,常見的JSON數(shù)據(jù)解析方案有4種:
第三方框架:JSONKit, SBJson, TouchJson.性能從左到右,依次變差.(iOS 5(2011年)以前)
蘋果原生(自帶):NSJSONSerialization (性能是最好的.iOS5以后推出).
2.解析JSON數(shù)據(jù)
<1>反序列化(解析):
將從服務(wù)器接收到的JSON數(shù)據(jù)(二進制數(shù)據(jù))轉(zhuǎn)換成OC數(shù)據(jù)類型(NSArray,NSDictionary等.)的過程.
目的: JSON數(shù)據(jù) --> OC對象; 得到數(shù)據(jù)字典或者數(shù)據(jù)數(shù)組
好處: 簡化程序的開發(fā),方便后續(xù)的字典轉(zhuǎn)模型.
方法:
+(id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
<2>序列化:
將數(shù)組或者字典發(fā)送給服務(wù)器之前,轉(zhuǎn)換成二進制數(shù)據(jù).
目的:OC對象 --> JSON數(shù)據(jù);得到二進制JSON數(shù)據(jù) NSData.
好處:方便網(wǎng)絡(luò)傳輸,提高傳輸速度.
方法:
+(NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
"需要注意的是,在做序列化之前,一定要檢測一下對象是否能夠被序列化."
// 在做序列化之前胁附,一定使用 isValidJSONObject 檢測一下要序列化的對象绝编,是否能夠正確被序列化
// 避免出現(xiàn)閃退榜轿!
}
/---------------------------------- 數(shù)據(jù)解析: 3.XML數(shù)據(jù) ----------------------------------/
{
1.XML(eXtensible Markup Language)'可擴展標記語言'.
XML跟JSON一樣,也是用來數(shù)據(jù)交互.
HTML是超文本標記語言.用來表示網(wǎng)頁頁面.
2.XML語法簡介
一個完整的XML文件叫XML文檔(XML Document).一個XML文檔一般由以下幾部分組成:
<1> 文檔聲明:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<2> 元素(Element)
1> 一個元素包括開始標簽和結(jié)束標簽.
<name>小紅</name>
一個元素可以沒有元素內(nèi)容,沒有元素內(nèi)容可以簡寫.
</person>
XML中所有的空格和換行,都會當做具體的內(nèi)容處理.
2> 一個元素可以嵌套若干個子元素(不能出現(xiàn)交叉嵌套).
<person>
<name>小花</name>
<age>16</age>
</person>
3> 規(guī)范的XML文檔最多只能有一個根元素,其他元素都是根元素的子元素.
<3> 屬性(Attribute)
1> 一個元素可以擁有多個屬性.
<person name = "小明" age = "18"/>
2> 屬性值必須用雙引號""或者單引號''括住.
3> 屬性信息可以用元素內(nèi)容來表示.
}
/---------------------------------- 數(shù)據(jù)解析: 4.XML解析 ----------------------------------/
{
XML解析:
所謂XML解析,指的就是將XML中元素的內(nèi)容取出來或者將元素中的屬性值提取出來.
XML解析方式: 1.SAX 2.DOM
1.SAX解析:
從根元素開始,一個元素一個元素的按順序往下解析.
比較適合大文件的解析.
* 解析方法:
蘋果原生: NSXMLParser ,使用簡單.設(shè)置代理就可以了.
NSXMLParser 采用SAX方式逐行往下解析,當掃描到下面的情況都會通知代理.
<1> 掃描到文檔(Doucument)的開始與結(jié)束的時候,會通知代理.
<2> 掃描到元素(Element)的開始與結(jié)束的時候,會通知代理.
<3> 掃描到元素中的內(nèi)容的時候,會通知代理.
* 使用步驟:
{
// 1.傳入XML,創(chuàng)建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 2.設(shè)置代理,監(jiān)聽解析過程
parser.delegate = self;
// 3.開始解析
[parser parse];
// 4.解析完畢之后刷新表格數(shù)據(jù)
[self.tableView reloadData];
// 4.實現(xiàn)代理方法
{
// 1.當掃描到文檔的開始時調(diào)用(開始解析)
- (void)parserDidStartDocument:(NSXMLParser *)parser;
// 2.當掃描到元素的開始時調(diào)用(attributeDict存放著元素的屬性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
// 3.發(fā)現(xiàn)元素中的內(nèi)容的時候開始調(diào)用
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
// 4.當掃描到元素結(jié)束時調(diào)用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
// 5.當掃描到文檔的結(jié)束時調(diào)用(解析完畢)
- (void)parserDidEndDocument:(NSXMLParser *)parser;
}
}
2.DOM解析:
一次性將整個XML文檔加載進內(nèi)存,內(nèi)存消耗比較大.
比較適合小文件.更加適用于Mac.
* 解析方法:
第三方框架:
* libxml2: 純C語言,默認包含在iOS SDK中,同時支持SAX和DOM方式解析.
* GDateXML: DOM方式解析,由Google開發(fā),基于libxml2.
* GDataXML使用步驟:
{
<1> 導(dǎo)入第三方框架 GDateXML;
<2> 注意修改三個地方:
1> Header Search Paths : /usr/include/libxml2
2> Other Linker Flags : -lxml2
3> 添加非ARC :-fno-objc-arc
<3> 使用方法:
{
// 1.加載整個XML文檔
GDataXMLDocument *dom = [[GDataXMLDocument alloc] initWithData:data options:0 error:NULL];
// 2.獲得文檔的根元素
GDataXMLElement *element = dom.rootElement;
// 3.得到根元素中包含的元素(vedio元素)
[element.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
GDataXMLElement *vedio = obj;
ITVedio *ITvedio = [[ITVedio alloc] init];
// 4.得到vedio元素中包含的元素內(nèi)容
[vedio.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
GDataXMLElement *ele = obj;
// 5.將元素內(nèi)容取出賦值.
[ITvedio setValue:ele.stringValue forKeyPath:ele.name];
}];
// 將數(shù)據(jù)模型放在數(shù)據(jù)源中.
[self.vedios addObject:ITvedio];
}];
}
}
}