OC中的JSON和XML的解析方案

JSON解析

什么是JSON

  • JSON(JavaScript Object Notation, JS 對(duì)象簡(jiǎn)譜) 是一種輕量級(jí)的數(shù)據(jù)交換格式撕蔼。
  • 易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成
  • 服務(wù)器返回給客戶端的數(shù)據(jù)窄坦,一般都是JSON格式或者XML格式(文件下載除外)
  • JSON的格式很像OC中的字典和數(shù)組
    例子:

{"name" : "xxm", "age" : 27}
{"names" : ["Simon", "linda", "kimi"]}

  • 標(biāo)準(zhǔn)JSON格式key必須是雙引號(hào)""

JSON與OC 轉(zhuǎn)換對(duì)照表

JSON OC
大括號(hào) { } NSDictionary
中括號(hào)[ ] NSArray
雙引號(hào) " " NSString
數(shù)字 6、6.6 NSNumber
true、flase NSNumber
null NSNull

iOS中的JSON的解析方案

在iOS中,JSON的常見(jiàn)解析方案

NSJSONSerialization

  • 蘋果原生(推薦使用):NSJSONSerialization(性能最好)

解析JSON

NSJSONSerialization的常見(jiàn)方法

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

    + (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
    
    • NSJSONReadingOptions
      • NSJSONReadingMutableContainers 解析出來(lái)的NSDictionaryNSArray是可變的
      • NSJSONReadingMutableLeaves 解析出來(lái)的對(duì)象中的NSString是可變的, 不推薦使用挥转。(解析不出來(lái)。)
      • NSJSONReadingAllowFragments 被解析的JSON數(shù)據(jù)的top-level 如果既不是NSDictionary也不是NSArray, 需使用該值.
      • 默認(rèn)值0orkNilOptions
    • 編碼
      JSON規(guī)范中列出的5種支持的編碼之一:UTF-8绑谣、 UTF-16LE党窜、UTF-16BEUTF-32LE 借宵、UTF-32BE
      最有效的是UTF-8
  • OC對(duì)象->JSON對(duì)象

     + (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)erro
    
    • + (BOOL)isValidJSONObject:(id)obj
      判斷當(dāng)前OC對(duì)象能否轉(zhuǎn)換為JSON數(shù)據(jù)
      具體限制:

      • obj是NSArrayNSDictionay 以及他們派生出來(lái)的子類
      • obj 包含的所有對(duì)象是NSString,NSNumber,NSArray,NSDictionaryNSNull
      • 字典中所有的key必須是NSString類型的
      • NSNumber的對(duì)象不能是NaN或無(wú)窮大
    • NSJSONWritingOptions

      • NSJSONWritingPrettyPrinted 漂亮的排版幌衣。對(duì)轉(zhuǎn)換之后的JSON對(duì)象進(jìn)行排版
      • NSJSONWritingSortedKeys ios 11.0 之后使用,會(huì)對(duì)生成的數(shù)據(jù),按照key的字母大小進(jìn)行排序壤玫。數(shù)據(jù)一行顯示.
      • 默認(rèn)值 0or kNilOptions 數(shù)據(jù)一行顯示

字典轉(zhuǎn)模型

常用第三方框架

  • Mantle 需要繼承自MTModel
  • JSONModel 需要繼承自JSONModel
  • MJExtension 不需要繼承豁护,無(wú)代碼侵入性
  • YYModel不需要繼承,無(wú)代碼侵入性欲间、高性能

自己設(shè)計(jì)和選擇框架時(shí)需要注意的問(wèn)題

  • 侵入性
  • 易用性楚里,是否容易上手
  • 擴(kuò)展性,很容易給這個(gè)框架增加新的功能

XML的解析

什么是XML

  • XML全稱是Extensible Markup Language猎贴,譯作“可擴(kuò)展標(biāo)記語(yǔ)言”
  • 交互的數(shù)據(jù)格式
  • 一般也叫XML文檔(XML Document)

XML語(yǔ)法

一個(gè)常見(jiàn)的XML文檔一般由以下部分組成

  • 文檔聲明
  • 元素(Element)
  • 屬性(Attribute)

注意不能交叉包含班缎、空行換行、XML文檔只能有一個(gè)根元素等

XML語(yǔ)法 – 文檔聲明

在XML文檔的最前面她渴,必須編寫一個(gè)文檔聲明达址,用來(lái)聲明XML文檔的類型
最簡(jiǎn)單的聲明
<?xml version="1.0" ?>
用encoding屬性說(shuō)明文檔的字符編碼
<?xml version="1.0" encoding="UTF-8" ?>

XML語(yǔ)法 – 元素(Element)

  • 一個(gè)元素包括了開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽
    • 擁有內(nèi)容的元素:< name >菜式菜品</name >
    • 沒(méi)有內(nèi)容的元素:< name ></name >
    • 沒(méi)有內(nèi)容的元素簡(jiǎn)寫:< name/>
  • 一個(gè)元素可以嵌套若干個(gè)子元素(不能出現(xiàn)交叉嵌套)
  • 規(guī)范的XML文檔最多只有1個(gè)根元素,其他元素都是根元素的子孫元素

XML語(yǔ)法 –元素的注意

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

  • 下面兩個(gè)元素的內(nèi)容是不一樣的

    (一)< name >菜式菜品</name >
    (二)< name >
              菜式菜品
         </name >
    

XML語(yǔ)法 – 屬性(Attribute)

  • 一個(gè)元素可以擁有多個(gè)屬性
    <list name="菜式菜品" id="1" />
    list元素?fù)碛?code>name和id兩個(gè)屬性
    屬性值必須用 雙引號(hào)"" 或者 單引號(hào)'' 括住

  • 屬性表示的信息也可以用子元素來(lái)表示沉唠,比如

    < list >
      < name >菜式菜品</name>
          <id>1</id>
    </list >
    

解析XML

XML的解析方式有2種

  • DOM:一次性將整個(gè)XML文檔加載進(jìn)內(nèi)存,比較適合解析小文件
  • SAX:從根元素開(kāi)始苛败,按順序一個(gè)元素一個(gè)元素往下解析右冻,比較適合解析大文件

iOS中的XML的解析方案

  • 蘋果原生
    NSXMLParser:使用SAX方式解析,使用簡(jiǎn)單
  • 第三方框架
    • libxml2:純C語(yǔ)言著拭,默認(rèn)包含在iOS SDK中纱扭,同時(shí)支持DOM和SAX方式解析
    • GDataXML:DOM方式解析,由Google開(kāi)發(fā)儡遮,基于libxml2

NSXMLParser

使用NSXMLParser解析XML步驟和代理方法

  • 解析步驟:
    • 創(chuàng)建一個(gè)解析器
      NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    • 設(shè)置代理NSXMLParserDelegate
      parser.delegate = self;
    • 開(kāi)始解析
      [parser parse];
    • 實(shí)現(xiàn) NSXMLParserDelegate代理方法
  • NSXMLParser采取的是SAX方式解析乳蛾,以下事件會(huì)通知代理
    • 當(dāng)掃描到文檔(Document)的開(kāi)始與結(jié)束
    • 當(dāng)掃描到元素(Element)的開(kāi)始與結(jié)束

GDataXML配置

GDataXML基于libxml2庫(kù),得做以下配置

  • 導(dǎo)入libxml2庫(kù)

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

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

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


    image.png

GDataXML的使用

GDataXML中常用的類
GDataXMLDocument:代表整個(gè)XML文檔
elementsForName:獲得元素GDataXMLElement
GDataXMLElement:代表文檔中的每個(gè)元素
attributeForName:獲得屬性值

具體代碼查看Github項(xiàng)目

Github地址:iOSMultiTechnology
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肃叶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子十嘿,更是在濱河造成了極大的恐慌因惭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绩衷,死亡現(xiàn)場(chǎng)離奇詭異蹦魔,居然都是意外死亡激率,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門勿决,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乒躺,“玉大人,你說(shuō)我怎么就攤上這事低缩〖蚊埃” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵咆繁,是天一觀的道長(zhǎng)讳推。 經(jīng)常有香客問(wèn)我,道長(zhǎng)玩般,這世上最難降的妖魔是什么娜遵? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮壤短,結(jié)果婚禮上设拟,老公的妹妹穿的比我還像新娘。我一直安慰自己久脯,他們只是感情好纳胧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著帘撰,像睡著了一般跑慕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摧找,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天核行,我揣著相機(jī)與錄音,去河邊找鬼蹬耘。 笑死芝雪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的综苔。 我是一名探鬼主播惩系,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼如筛!你這毒婦竟也來(lái)了堡牡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤杨刨,失蹤者是張志新(化名)和其女友劉穎晤柄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體妖胀,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芥颈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年惠勒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浇借。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怕品,靈堂內(nèi)的尸體忽然破棺而出妇垢,到底是詐尸還是另有隱情,我是刑警寧澤肉康,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布闯估,位于F島的核電站,受9級(jí)特大地震影響吼和,放射性物質(zhì)發(fā)生泄漏涨薪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一炫乓、第九天 我趴在偏房一處隱蔽的房頂上張望刚夺。 院中可真熱鬧,春花似錦末捣、人聲如沸侠姑。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)莽红。三九已至,卻和暖如春邦邦,著一層夾襖步出監(jiān)牢的瞬間安吁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工燃辖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鬼店,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓黔龟,卻偏偏與公主長(zhǎng)得像薪韩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捌锭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • JSON JSON和XML都是需要解析的 JSON是一種輕量級(jí)的數(shù)據(jù)格式俘陷,一般用于數(shù)據(jù)交互服務(wù)器返回給客戶端的數(shù)據(jù)...
    JonesCxy閱讀 1,842評(píng)論 2 10
  • 一. XML數(shù)據(jù)交換格式 XML數(shù)據(jù)交換格式是一種自描述的數(shù)據(jù)交互格式,雖然XML數(shù)據(jù)格式不如JSON "輕便"观谦,...
    __season____閱讀 2,488評(píng)論 0 7
  • JSON 和 XML 一拉盾、JSON 1.什么是JSON JSON是一種輕量級(jí)的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互服務(wù)器返回...
    妳是我的天使閱讀 345評(píng)論 0 3
  • 本文主要介紹了XML和JSON數(shù)據(jù)解析的基本知識(shí)豁状,并展示了NSXMLParser方法捉偏、GDataXML第三方庫(kù)以及...
    Rim99閱讀 2,440評(píng)論 1 21
  • JSON 什么是 JSON: JSON 是一種輕量級(jí)的數(shù)據(jù)格式倒得,一般用于數(shù)據(jù)交互;服務(wù)器返回給客戶端的數(shù)據(jù)夭禽,一般都...
    Erbash閱讀 383評(píng)論 0 1