iOS 數(shù)據(jù)解析 JSON & XML 入門

/------------------------------------ 數(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];
            
            }];
        
    }
}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祠乃,更是在濱河造成了極大的恐慌缴渊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炊甲,死亡現(xiàn)場離奇詭異泥彤,居然都是意外死亡,警方通過查閱死者的電腦和手機卿啡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門吟吝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颈娜,你說我怎么就攤上這事剑逃。” “怎么了官辽?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵蛹磺,是天一觀的道長。 經(jīng)常有香客問我同仆,道長萤捆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任俗批,我火速辦了婚禮俗或,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扶镀。我一直安慰自己蕴侣,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布臭觉。 她就那樣靜靜地躺著昆雀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝠筑。 梳的紋絲不亂的頭發(fā)上狞膘,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音什乙,去河邊找鬼挽封。 笑死,一個胖子當著我的面吹牛臣镣,可吹牛的內(nèi)容都是我干的辅愿。 我是一名探鬼主播智亮,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼点待!你這毒婦竟也來了阔蛉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤癞埠,失蹤者是張志新(化名)和其女友劉穎状原,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苗踪,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡颠区,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了通铲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毕莱。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖测暗,靈堂內(nèi)的尸體忽然破棺而出央串,到底是詐尸還是另有隱情,我是刑警寧澤碗啄,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布质和,位于F島的核電站,受9級特大地震影響稚字,放射性物質(zhì)發(fā)生泄漏饲宿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一胆描、第九天 我趴在偏房一處隱蔽的房頂上張望瘫想。 院中可真熱鬧,春花似錦昌讲、人聲如沸国夜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽车吹。三九已至,卻和暖如春醋闭,著一層夾襖步出監(jiān)牢的瞬間窄驹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工证逻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乐埠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像丈咐,于是被迫代替她去往敵國和親瑞眼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.定義介紹(1).XML定義擴展標記語言 (Extensible Markup Language, XML) 扯罐,...
    gogoingmonkey閱讀 452評論 0 1
  • 前言 對于像我這樣的初學(xué)者负拟,在剛學(xué)習(xí)網(wǎng)絡(luò)請求的時候?qū)τ赬ML和JSON時區(qū)分不清,不知道什么時候用XML歹河,什么時候...
    田亮子閱讀 1,082評論 0 4
  • JSON(Javascript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫花吟。同...
    l_genius閱讀 5,058評論 0 5
  • 今個去面試秸歧,一個人事經(jīng)理問我xml和json的區(qū)別我沒答上來感覺很難過,于是就回來后就查閱相關(guān)資料寫點東西:: 1...
    丁橋人在外地閱讀 12,935評論 5 35
  • 空氣太污濁 亂了規(guī)律 距離太遠 聽不到呼喚 用了心 明白了謊言 假若還有荒田 記得成為森林 假若還有旅途 記得微笑...
    打不敗的神魔閱讀 245評論 0 0