網(wǎng)絡(luò)整理(三)——數(shù)據(jù)解析

數(shù)據(jù)解析: 1.JSON數(shù)據(jù)

重點(diǎn):1.什么是JSON數(shù)據(jù).
{

1.JSON:是一種輕量級(jí)的傳輸數(shù)據(jù)格式,用于數(shù)據(jù)交互.

JSON是javascript語言的一個(gè)子集.javascript是個(gè)腳本語言(不需要編譯),用來給HTML增加動(dòng)態(tài)功能.
javascript和java沒有半毛錢的關(guān)系!

服務(wù)器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XML格式(文件下載除外).

語法規(guī)則:

<1> 數(shù)據(jù)以鍵值的方式保存;
    鍵(key)必須用雙引號(hào)("key"),與鍵值之間以':'分隔; {"name":"小明"}

<2> 數(shù)據(jù)和數(shù)據(jù)之間以逗號(hào)(,)分隔. {"name":"小明","age":13}

<3> {}表示對(duì)象. "person":{"name":"小明","age":13}

<4> []表示數(shù)組. "persons":[
        {"name":"小明","age":13},
        {"name":"小紅","age":14},
        {"name":"小花","age":15}
    ]

2.JSON與OC轉(zhuǎn)換對(duì)照:

大括號(hào) {} == NSDictionary;
中括號(hào) [] == NSArray;
雙引號(hào)" " == NSString;
數(shù)字13,13.5 == NSNumber;

3.數(shù)據(jù)傳輸過程:

客戶端發(fā)送請(qǐng)求給服務(wù)器,服務(wù)器接收到客戶端的請(qǐng)求之后,返回給客戶端JSON數(shù)據(jù).

客戶端需要把服務(wù)器返回的JSON數(shù)據(jù)轉(zhuǎn)換為OC的數(shù)據(jù)格式(數(shù)組/字典等).

}


數(shù)據(jù)解析: 2.JSON解析

重點(diǎn):1.JSON數(shù)據(jù)解析
{

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ù)(二進(jìn)制數(shù)據(jù))轉(zhuǎn)換成OC數(shù)據(jù)類型(NSArray,NSDictionary等.)的過程.

目的: JSON數(shù)據(jù) --> OC對(duì)象; 得到數(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)換成二進(jìn)制數(shù)據(jù).

目的:OC對(duì)象 --> JSON數(shù)據(jù);得到二進(jìn)制JSON數(shù)據(jù) NSData.

好處:方便網(wǎng)絡(luò)傳輸,提高傳輸速度.

方法:

+(NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

"需要注意的是,在做序列化之前,一定要檢測(cè)一下對(duì)象是否能夠被序列化."
// 在做序列化之前,一定使用 isValidJSONObject 檢測(cè)一下要序列化的對(duì)象,是否能夠正確被序列化
// 避免出現(xiàn)閃退!

}


數(shù)據(jù)解析: 3.XML數(shù)據(jù)

重點(diǎn):1.什么是XML
{

1.XML(eXtensible Markup Language)'可擴(kuò)展標(biāo)記語言'.

XML跟JSON一樣,也是用來數(shù)據(jù)交互.

HTML是超文本標(biāo)記語言.用來表示網(wǎng)頁頁面.

2.XML語法簡介

一個(gè)完整的XML文件叫XML文檔(XML Document).一個(gè)XML文檔一般由以下幾部分組成:
<1> 文檔聲明:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<2> 元素(Element)

    1> 一個(gè)元素包括開始標(biāo)簽和結(jié)束標(biāo)簽.
        <name>小紅</name>

       一個(gè)元素可以沒有元素內(nèi)容,沒有元素內(nèi)容可以簡寫.
        </person>

       XML中所有的空格和換行,都會(huì)當(dāng)做具體的內(nèi)容處理.

    2> 一個(gè)元素可以嵌套若干個(gè)子元素(不能出現(xiàn)交叉嵌套).
        <person>
            <name>小花</name>
            <age>16</age>
        </person>

    3> 規(guī)范的XML文檔最多只能有一個(gè)根元素,其他元素都是根元素的子元素.

<3> 屬性(Attribute)

    1> 一個(gè)元素可以擁有多個(gè)屬性.

    <person name = "小明" age = "18"/>

    2> 屬性值必須用雙引號(hào)""或者單引號(hào)''括住.

    3> 屬性信息可以用元素內(nèi)容來表示.

}


數(shù)據(jù)解析: 4.XML解析

重點(diǎn):1.XML兩種解析方式. 2.解析方式的選擇.
{

XML解析:

    所謂XML解析,指的就是將XML中元素的內(nèi)容取出來或者將元素中的屬性值提取出來.

XML解析方式: 1.SAX 2.DOM

1.SAX解析:

    從根元素開始,一個(gè)元素一個(gè)元素的按順序往下解析.

    比較適合大文件的解析.

* 解析方法:

    蘋果原生: NSXMLParser ,使用簡單.設(shè)置代理就可以了.

    NSXMLParser 采用SAX方式逐行往下解析,當(dāng)掃描到下面的情況都會(huì)通知代理.

        <1> 掃描到文檔(Doucument)的開始與結(jié)束的時(shí)候,會(huì)通知代理.

        <2> 掃描到元素(Element)的開始與結(jié)束的時(shí)候,會(huì)通知代理.

        <3> 掃描到元素中的內(nèi)容的時(shí)候,會(huì)通知代理.

* 使用步驟:
{
    // 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.實(shí)現(xiàn)代理方法
    {
        // 1.當(dāng)掃描到文檔的開始時(shí)調(diào)用(開始解析)
        - (void)parserDidStartDocument:(NSXMLParser *)parser;
        
        // 2.當(dāng)掃描到元素的開始時(shí)調(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)容的時(shí)候開始調(diào)用
        - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
        
        // 4.當(dāng)掃描到元素結(jié)束時(shí)調(diào)用
        - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
        
        // 5.當(dāng)掃描到文檔的結(jié)束時(shí)調(diào)用(解析完畢)
        - (void)parserDidEndDocument:(NSXMLParser *)parser;

    }
}

2.DOM解析:

    一次性將整個(gè)XML文檔加載進(jìn)內(nèi)存,內(nèi)存消耗比較大.

    比較適合小文件.更加適用于Mac.

* 解析方法:

    第三方框架:

    * libxml2: 純C語言,默認(rèn)包含在iOS SDK中,同時(shí)支持SAX和DOM方式解析.
    
    * GDateXML: DOM方式解析,由Google開發(fā),基于libxml2.

* GDataXML使用步驟:
{
    <1> 導(dǎo)入第三方框架 GDateXML;
    
    <2> 注意修改三個(gè)地方:
    
        1> Header Search Paths : /usr/include/libxml2
    
        2> Other Linker Flags : -lxml2
    
        3> 添加非ARC :-fno-objc-arc
    
    <3> 使用方法:
    {
        // 1.加載整個(gè)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];
            
        }];

    }
}

}


補(bǔ)充知識(shí)點(diǎn)

{

注意:播放視頻

1. 導(dǎo)入: MediaPlayer/MediaPlayer.h
#import <MediaPlayer/MediaPlayer.h>

2. 創(chuàng)建視頻播放控制器
MPMoviePlayerViewController *mv = [[MPMoviePlayerViewController alloc] initWithContentURL:url];

3. 跳轉(zhuǎn)到控制器播放視頻
[self presentMoviePlayerViewControllerAnimated:mv];


NSNumber 替代 int,防止 null 錯(cuò)誤.

NSArray + Log 分類,打印漢字,方便調(diào)試.

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,211評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,475評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,834評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,009評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,559評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,516評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,728評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,249評(píng)論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,484評(píng)論 2 379

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