19 - JSON叉钥、XML

JSON

  • JSON是一種輕量級的數(shù)據(jù)格式
  • 一般用于數(shù)據(jù)交互
  • 服務(wù)器返回給客戶端的數(shù)據(jù)罢缸,一般都是JSON格式或者XML格式(文件下載除外)
  • JSON的格式很像OC中的字典和數(shù)組(少了個@) :
"name" : "jack", "age" : 10
"names" : "jack", "rose", "jim"
Snip20150924_3.png
  • 標(biāo)準(zhǔn)JSON格式的注意點:key必須用雙引號
  • 要想從JSON中挖掘出具體數(shù)據(jù).得對JSON進行解析:將JSON 轉(zhuǎn)換為 OC數(shù)據(jù)類型.

JSON – OC 轉(zhuǎn)換對照表

Snip20150903_8.png

在iOS中,JSON的常見解析方案有4種:

1.2.3屬于第三方框架啊.4是蘋果原生自帶的.性能也是最好的.

  1. JSONKit
  2. SBJson
  3. TouchJSON
  4. NSJSONSerialization(常用)

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

  • {} -> NSDictionary @{}
  • [] -> NSArray @[]
  • "jack" -> NSString @"jack"
  • 10 -> NSNumber @10
  • 10.5 -> NSNumber @10.5
  • true -> NSNumber @1
  • false -> NSNumber @0
  • null -> NSNull

NSJSONSerialization的常見方法

// 利用NSJSONSerialization類
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

NSJSONReadingOptions:

  • 創(chuàng)建出來的數(shù)組和字典就是可變
  • NSJSONReadingMutableContainers = (1UL << 0)
  • 數(shù)組或者字典里面的字符串是可變的
  • NSJSONReadingMutableLeaves = (1UL << 1)
  • 允許解析出來的對象不是字典或者數(shù)組投队,比如直接是字符串或者NSNumber
  • NSJSONReadingAllowFragments

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

// 利用NSJSONSerialization類
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

如果服務(wù)器返回的數(shù)據(jù)看不懂,這么辦?

解析來自服務(wù)器的JSON示意圖 :


XML

  • XML的全稱是Extensible Markup Language譯作“可擴展標(biāo)記語言”
  • 跟JSON一樣枫疆,也是常用的一種用于交互的數(shù)據(jù)格式
  • 一般也叫XML文檔(XML Document)

XML舉例

<videos>
<video name="茉莉 第01部" length="30" />
<video name="菊花 第02部" length="19" />
<video name="玫瑰 第03部" length="33" />
</videos>

XML語法

  • 一個常見的XML文檔一般由以下部分組成 :
  • 文檔聲明
  • 元素(Element)
  • 屬性(Attribute)

XML語法 - 文檔聲明

  • 在XML文檔的最前面,必須編寫一個文檔聲明敷鸦,用來聲明XML文檔的類型.

最簡單的聲明:
<? xml version="1.0" ? >
用encoding屬性說明文檔的字符編碼
<? xml version="1.0" encoding="UTF-8" ?>

XML語法 - 元素(Element)

  • 一個元素包括了開始標(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個根元素息楔,其他元素都是根元素的子孫元素
元素的注意:
  • XML中的所有空格和換行,都會當(dāng)做具體內(nèi)容處理
    下面兩個元素的內(nèi)容是不一樣的
    第1個 :
<video>茉莉</video>

第2個 :

<video>
    茉莉
</video>

XML語法 - 屬性(Attribute)

  • 一個元素可以擁有多個屬性
    <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" />

XML的解析方式有2種

  1. DOM:一次性將整個XML文檔加載進內(nèi)存,比較適合解析小文件
  1. SAX:從根元素開始谎碍,按順序一個元素一個元素往下解析,比較適合解析大文件

iOS中的XML解析

  1. 蘋果原生:NSXMLParser:SAX方式解析洞焙,使用簡單
  1. 第三方框架 :
    2.1 : libxml2:純C語言蟆淀,默認(rèn)包含在iOS SDK中,同時支持DOM和SAX方式解析;
    2.2 : GDataXML:DOM方式解析澡匪,由Google開發(fā)熔任,基于libxml2;

XML解析方式的選擇建議

大文件:NSXMLParser、libxml2
小文件:GDataXML唁情、NSXMLParser疑苔、libxml2

NSXMLParser

使用步驟 :
// 傳入XML數(shù)據(jù)形入,創(chuàng)建解析器
NSXMLParser *parser = [NSXMLParser alloc] initWithData:data;  
// 設(shè)置代理币砂,監(jiān)聽解析過程
parser.delegate = self;
// 開始解析
[parser parse];
  • NSXMLParser采取的是SAX方式解析言津,特點是事件驅(qū)動蝴光,下面情況都會通知代理
  1. 當(dāng)掃描到文檔(Document)的開始與結(jié)束
  2. 當(dāng)掃描到元素(Element)的開始與結(jié)束

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

// - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

GDataXML

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


    Snip20150903_10.png
  • 設(shè)置libxml2的頭文件搜索路徑(為了能找到libxml2庫的所有頭文件)
    在Head Search Path中加入/usr/include/libxml2

  • 設(shè)置鏈接參數(shù)(自動鏈接libxml2庫)
    在Other Linker Flags中加入-lxml2

由于GDataXML是非ARC的凳谦,因此得設(shè)置編譯參數(shù)

Snip20150903_11.png

GDataXML使用

GDataXML中常用的類

GDataXMLDocument:代表整個XML文檔

GDataXMLElement

代表文檔中的每個元素

使用attributeForName:方法可以獲得屬性值

JSON和XML的比較

相比之下艘狭,JSON的體積小于XML已卸,所以服務(wù)器返回給移動端的數(shù)據(jù)格式以JSON居多

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刻恭,一起剝皮案震驚了整個濱河市瞧省,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖鞍匾,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件交洗,死亡現(xiàn)場離奇詭異,居然都是意外死亡橡淑,警方通過查閱死者的電腦和手機构拳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梳码,“玉大人隐圾,你說我怎么就攤上這事£瑁” “怎么了暇藏?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長濒蒋。 經(jīng)常有香客問我盐碱,道長,這世上最難降的妖魔是什么沪伙? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任瓮顽,我火速辦了婚禮,結(jié)果婚禮上围橡,老公的妹妹穿的比我還像新娘暖混。我一直安慰自己,他們只是感情好翁授,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布拣播。 她就那樣靜靜地躺著,像睡著了一般收擦。 火紅的嫁衣襯著肌膚如雪贮配。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天塞赂,我揣著相機與錄音泪勒,去河邊找鬼。 笑死宴猾,一個胖子當(dāng)著我的面吹牛圆存,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仇哆,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辽剧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了税产?” 一聲冷哼從身側(cè)響起怕轿,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤偷崩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撞羽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阐斜,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年诀紊,在試婚紗的時候發(fā)現(xiàn)自己被綠了谒出。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡邻奠,死狀恐怖笤喳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碌宴,我是刑警寧澤杀狡,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贰镣,受9級特大地震影響呜象,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碑隆,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一恭陡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧上煤,春花似錦休玩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嘉熊,卻和暖如春遥赚,著一層夾襖步出監(jiān)牢的瞬間扬舒,已是汗流浹背阐肤。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讲坎,地道東北人孕惜。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像晨炕,于是被迫代替她去往敵國和親衫画。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • JSON JSON和XML都是需要解析的 JSON是一種輕量級的數(shù)據(jù)格式瓮栗,一般用于數(shù)據(jù)交互服務(wù)器返回給客戶端的數(shù)據(jù)...
    JonesCxy閱讀 1,857評論 2 10
  • JSON 和 XML 一削罩、JSON 1.什么是JSON JSON是一種輕量級的數(shù)據(jù)格式瞄勾,一般用于數(shù)據(jù)交互服務(wù)器返回...
    妳是我的天使閱讀 353評論 0 3
  • 解析的基本概念 解析: 從事先規(guī)定好的格式中提取數(shù)據(jù) 解析的前提: 提前約定好格式,數(shù)據(jù)提供方按照格式提供數(shù)據(jù),數(shù)...
    云之君兮鵬閱讀 1,848評論 4 28
  • 本文主要介紹了XML和JSON數(shù)據(jù)解析的基本知識,并展示了NSXMLParser方法弥激、GDataXML第三方庫以及...
    Rim99閱讀 2,448評論 1 21
  • JSON 什么是 JSON: JSON 是一種輕量級的數(shù)據(jù)格式进陡,一般用于數(shù)據(jù)交互;服務(wù)器返回給客戶端的數(shù)據(jù)微服,一般都...
    Erbash閱讀 389評論 0 1