JSON 和 XML

JSON 和 XML

一琉朽、JSON

1.什么是JSON

JSON是一種輕量級的數(shù)據(jù)格式膏潮,一般用于數(shù)據(jù)交互
服務(wù)器返回給客戶端的數(shù)據(jù)沪猴,一般都是JSON格式或者XML格式(文件下載除外)
2.JSON的格式很像OC中的字典和數(shù)組

{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}
標(biāo)準(zhǔn)JSON格式的注意點(diǎn): key必須用雙引號
要想從JSON中挖掘出具體數(shù)據(jù)麸俘,得對JSON進(jìn)行解析
JSON OC
大括號{} NSDictionary
中括號[] NSArray
雙引號"" NSString
數(shù)字 NSNumber
true/false NSNumber
null NSNull
JSON 轉(zhuǎn)換為 OC數(shù)據(jù)類型
3.在iOS中齐板,JSON的常見解析方案有4種

①第三方框架:JSONKit吵瞻、SBJson、TouchJSON(性能從左到右甘磨,越差)

②蘋果原生(自帶):NSJSONSerialization(性能最好)

NSJSONSerialization的常見方法

JSON數(shù)據(jù) -> OC對象

/*
第一個參數(shù):需要解析的JSON數(shù)據(jù)
第二個參數(shù):解析JSON的可選配置參數(shù)
 NSJSONReadingMutableContainers 解析出來的字典和數(shù)組是可變的
 NSJSONReadingMutableLeaves 解析出來的對象中得字符串是可變的橡羞,iOS7以后有問題
 NSJSONReadingAllowFragments 解析出來的JSON數(shù)據(jù)既不是字典也不是數(shù)組,那么就必須使用這個
*/
  • (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
    iOS5自帶解析類NSJSONSerialization從response中解析出數(shù)據(jù)放到字典中

    NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
    OC對象 -> JSON數(shù)據(jù)

/*
第一個參數(shù):需要轉(zhuǎn)換為JSON數(shù)據(jù)的OC對象
第二個參數(shù):毫無意義
NSJSONWritingPrettyPrinted:對轉(zhuǎn)換之后的JSON進(jìn)行排版
*/

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

4.查看復(fù)雜的JSON數(shù)據(jù)

①在線轉(zhuǎn)換济舆,查看格式化

http://tool.oschina.net/codeformat/json

②直接將轉(zhuǎn)換后的數(shù)據(jù)寫到本地

NSDictionary *Dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
[dict writeToFile:@"路徑" atomically:YES];
5.JSON轉(zhuǎn)字典卿泽,字典再模型

Mantle
所有的模型都必須繼承自MTModel
JSONModel
所有的模型都必須繼承自JSONModel
MJExtension
不需要強(qiáng)制繼承任何其他類
設(shè)計框架需要考慮的問題

侵入性
侵入性大就意味著很難離開這個框架
易用性
比較少量代碼實現(xiàn)N多功能
擴(kuò)展性
很容易給這個框架增加新框架
二、XML

1.什么是XML

全稱是Extensible Markup Language滋觉,譯作“可擴(kuò)展標(biāo)記語言”
跟JSON一樣签夭,也是常用的一種用于交互的數(shù)據(jù)格式
一般也叫XML文檔(XML Document)
2.XML舉例

<videos>
<video name="小黃人 第01部" length="30" />
<video name="小黃人 第02部" length="19" />
<video name="小黃人 第03部" length="33" />
</videos>
3.一個常見的XML文檔一般由以下部分組成

文檔聲明
元素(Element)
屬性(Attribute)
4.在XML文檔的最前面,必須編寫一個文檔聲明椎侠,用來聲明XML文檔的類型

最簡單的聲明

<?xml version="1.0" ?>
用encoding屬性說明文檔的字符編碼

<?xml version="1.0" encoding="UTF-8" ?>
5.一個元素包括了開始標(biāo)簽和結(jié)束標(biāo)簽

擁有內(nèi)容的元素: <video>小黃人</video>
沒有內(nèi)容的元素: <video></video>
沒有內(nèi)容的元素簡寫: <video/>
一個元素可以嵌套若干個子元素(不能出現(xiàn)交叉嵌套)
<videos>
<video>
<name>小黃人 第01部</name>
<length>30</length>
</video>
</videos>
規(guī)范的XML文檔最多只有1個根元素第租,其他元素都是根元素的子孫元素
6.XML中的所有空格和換行,都會當(dāng)做具體內(nèi)容處理

下面兩個元素的內(nèi)容是不一樣的
第1個
<video>小黃人</video>
第2個
<video>
小黃人
</video>
7.一個元素可以擁有多個屬性

<video name="小黃人 第01部" length="30" />

video元素?fù)碛衝ame和length兩個屬性
屬性值必須用 雙引號"" 或者 單引號'' 括住
實際上我纪,屬性表示的信息也可以用子元素來表示慎宾,比如

<video>
<name>小黃人 第01部</name>
<length>30</length>
</video>
三、XML解析

要想從XML中提取有用的信息浅悉,必須得學(xué)會解析XML
提取name元素里面的內(nèi)容
<name>小黃人 第01部</name>
提取video元素中name和length屬性的值

<video name="小黃人 第01部" length="30" />
1.XML的解析方式有2種

DOM:一次性將整個XML文檔加載進(jìn)內(nèi)存趟据,比較適合解析小文件
SAX:從根元素開始,按順序一個元素一個元素往下解析术健,比較適合解析大文件
iOS中的XML解析

在iOS中汹碱,解析XML的手段有很多

1.蘋果原生

NSXMLParser:SAX方式解析,使用簡單
2.第三方框架

libxml2:純C語言苛坚,默認(rèn)包含在iOS SDK中比被,同時支持DOM和SAX方式解析
GDataXML:DOM方式解析,由Google開發(fā)泼舱,基于libxml2
XML解析方式的選擇建議

大文件:NSXMLParser、libxml2
小文件:GDataXML枷莉、NSXMLParser娇昙、libxml2
2.NSXMLParser

NSXMLParser采取的是SAX方式解析,特點(diǎn)是事件驅(qū)動笤妙,下面情況都會通知代理
當(dāng)掃描到文檔(Document)的開始與結(jié)束
當(dāng)掃描到元素(Element)的開始與結(jié)束
使用步驟

①.開始解析

// 傳入XML數(shù)據(jù)冒掌,創(chuàng)建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 設(shè)置代理噪裕,監(jiān)聽解析過程
parser.delegate = self;
// 開始解析(parse方法是阻塞式的)
[parser parse];
②.NSXMLParserDelegate

// 當(dāng)掃描到文檔的開始時調(diào)用(開始解析)

  • (void)parserDidStartDocument:(NSXMLParser *)parser

// 當(dāng)掃描到文檔的結(jié)束時調(diào)用(解析完畢)

  • (void)parserDidEndDocument:(NSXMLParser *)parser

// 當(dāng)掃描到元素的開始時調(diào)用(attributeDict存放著元素的屬性)

  • (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

// 當(dāng)掃描到元素的結(jié)束時調(diào)用

  • (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    3.GDataXML

①GDataXML配置

GDataXML基于libxml2庫,得做以下配置
導(dǎo)入libxml2庫

設(shè)置libxml2的頭文件搜索路徑(為了能找到libxml2庫的所有頭文件)

在Head Search Path中加入/usr/include/libxml2
設(shè)置鏈接參數(shù)(自動鏈接libxml2庫)

在Other Linker Flags中加入-lxml2
由于GDataXML是非ARC的股毫,因此得設(shè)置編譯參數(shù)

-fno-objc-arc
②GDataXML使用

GDataXML中常用的類

GDataXMLDocument:代表整個XML文檔
GDataXMLElement

代表文檔中的每個元素
使用attributeForName:方法可以獲得屬性值
// 1.創(chuàng)建URL
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
// 2.根據(jù)URL創(chuàng)建Request
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 3.利用NSURLConnection發(fā)送請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 1.加載所有的xml到內(nèi)存中
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:kNilOptions error:nil];
// 2.獲取根元素
GDataXMLElement *rootElement = doc.rootElement;
// 3.從根元素中獲取所有子元素
NSArray *elements = [rootElement elementsForName:@"video"];
// 4.將子元素中的屬性轉(zhuǎn)換為模型
for (GDataXMLElement *ele in elements) {
XMGVideo *video = [[XMGVideo alloc] init];
video.image = [ele attributeForName:@"image"].stringValue;
video.url = [ele attributeForName:@"url"].stringValue;
video.name = [ele attributeForName:@"name"].stringValue;
video.length = @([ele attributeForName:@"length"].stringValue.integerValue);
[self.videos addObject:video];
}
[self.tableView reloadData];
}];

四膳音、JSON和XML比較

同一份數(shù)據(jù),既可以用JSON來表示铃诬,也可以用XML來表示
相比之下祭陷,JSON的體積小于XML,所以服務(wù)器返回給移動端的數(shù)據(jù)格式以JSON居多
五趣席、利用蘋果官方API播放視頻

// 創(chuàng)建視頻播放器
MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:urlStr]];

// 顯示視頻
[self presentViewController:vc animated:YES completion:nil];和

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兵志,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宣肚,更是在濱河造成了極大的恐慌想罕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霉涨,死亡現(xiàn)場離奇詭異按价,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)笙瑟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門楼镐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逮走,你說我怎么就攤上這事鸠蚪。” “怎么了师溅?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵茅信,是天一觀的道長。 經(jīng)常有香客問我墓臭,道長蘸鲸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任窿锉,我火速辦了婚禮酌摇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗡载。我一直安慰自己窑多,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布洼滚。 她就那樣靜靜地躺著埂息,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上千康,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天享幽,我揣著相機(jī)與錄音,去河邊找鬼拾弃。 笑死值桩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豪椿。 我是一名探鬼主播奔坟,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砂碉!你這毒婦竟也來了蛀蜜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤增蹭,失蹤者是張志新(化名)和其女友劉穎滴某,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滋迈,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霎奢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了饼灿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幕侠。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碍彭,靈堂內(nèi)的尸體忽然破棺而出晤硕,到底是詐尸還是另有隱情,我是刑警寧澤庇忌,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布舞箍,位于F島的核電站,受9級特大地震影響皆疹,放射性物質(zhì)發(fā)生泄漏疏橄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一略就、第九天 我趴在偏房一處隱蔽的房頂上張望捎迫。 院中可真熱鬧,春花似錦表牢、人聲如沸窄绒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颗祝。三九已至浊闪,卻和暖如春恼布,著一層夾襖步出監(jiān)牢的瞬間螺戳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工折汞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倔幼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓爽待,卻偏偏與公主長得像损同,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸟款,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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

  • JSON JSON和XML都是需要解析的 JSON是一種輕量級的數(shù)據(jù)格式膏燃,一般用于數(shù)據(jù)交互服務(wù)器返回給客戶端的數(shù)據(jù)...
    JonesCxy閱讀 1,853評論 2 10
  • JSON 什么是JSON JSON是一種輕量級的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互. 服務(wù)器返回給客戶端的數(shù)據(jù)何什,一般都是J...
    coma閱讀 272評論 0 1
  • 使用NSURLConnection來請求數(shù)據(jù) JSON數(shù)據(jù)的請求 現(xiàn)在大多情況下都使用三方框架來完成的 l在iOS...
    iamgaoshuai閱讀 575評論 0 1
  • 簡介 JSON是一種輕量級的數(shù)據(jù)格式组哩,一般用于數(shù)據(jù)交互 服務(wù)器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XML格...
    SanMao_SFW閱讀 460評論 0 1
  • JSON 什么是 JSON: JSON 是一種輕量級的數(shù)據(jù)格式处渣,一般用于數(shù)據(jù)交互伶贰;服務(wù)器返回給客戶端的數(shù)據(jù),一般都...
    Erbash閱讀 386評論 0 1