天天看點

JSON 和 XMLJSONXMLGDataXML

JSON

什麼是 JSON:

JSON 是一種輕量級的資料格式,一般用于資料互動;

伺服器傳回給用戶端的資料,一般都是 JSON 格式或者 XML 格式(檔案下載下傳除外)

JSON 的格式很像 OC 中的字典和數組

{"name" : "jack", "age" : 10}

{"names" : ["jack", "rose", "jim"]}

标準 JSON 格式的注意點:key 必須用雙引号

要想從 JSON 中挖掘出具體資料,得對 JSON 進行解析。把原有的 JSON 轉換為 OC 資料類型;

JSON – OC 轉換對照表

JSON 和 XMLJSONXMLGDataXML

JSON – OC 轉換練習

JSON 和 XMLJSONXMLGDataXML

JSON 轉 OC

JSON 解析方案

在 iOS 中,JSON 的常見解析方案有幾種?

4 種;

  • 第三方架構:
    • JSONKit
    • SBJson
    • TouchJSON(性能從上到下,越差)
  • 蘋果原生(自帶):
    • NSJSONSerialization(性能最好)

NSJSONSerialization 的常見方法:

  • JSON資料 > OC對象
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
           
  • OC對象 > JSON資料
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
           

解析來自伺服器的 JSON

JSON 和 XMLJSONXMLGDataXML

XML

什麼是 XML?

全稱是 Extensible Markup Language,譯作“可擴充标記語言”。跟 JSON 一樣,也是常用的一種用于互動的資料格式。一般也叫 XML 文檔(XML Document)

XML 舉例

<videos>
    <video name="小黃人 第01部" length="30" />
    <video name="小黃人 第02部" length="19" />
    <video name="小黃人 第03部" length="33" />
</videos>
           

XML 文法

一個常見的 XML 文檔一般由以下部分組成:

  • 文檔聲明
    • 在 XML 文檔的最前面,必須編寫一個文檔聲明,用來聲明 XML 文檔的類型;
      • 最簡單的聲明

        <?xml version="1.0" ?>

      • 用 encoding 屬性說明文檔的字元編碼

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

  • 元素(Element)
    • 一個元素包括了開始标簽和結束标簽;
      • 擁有内容的元素:<video>小黃人</video>
      • 沒有内容的元素:<video></video>
      • 沒有内容的元素簡寫:<video/>
    • 一個元素可以嵌套若幹個子元素(不能出現交叉嵌套)
      <videos>
      <video>
          <name>小黃人 第01部</name>
            <length>30</length>
      </video>
      </videos>
                 
  • 規範的 XML 文檔最多隻有 1 個根元素,其他元素都是根元素的子孫元素
注意
  • XML 中的所有空格和換行,都會當做具體内容處理
    • 下面兩個元素的内容是不一樣的
      • 第1個
      <video>小黃人</video>
                 
      • 第2個
      <video>
          小黃人
      </video>
                 
  • 屬性(Attribute)
    • 一個元素可以擁有多個屬性
    <video name="小黃人 第01部" length="30" />
               
    • video 元素擁有 name 和 length 兩個屬性
    • 屬性值必須用雙引号" " 或者單引号' ' 包覆
  • 實際上,屬性表示的資訊也可以用子元素來表示,比如
<video>
    <name>小黃人 第01部</name>
        <length>30</length>
</video>
           

XML 解析

  • 要想從 XML 中提取有用的資訊,必須得學會解析 XML
    • 提取 name 元素裡面的内容
    <name>小黃人 第01部</name>
               
    • 提取 video 元素中 name 和 length 屬性的值
    <video name="小黃人 第01部" length="30" />
               

XML 的解析方式有幾種?

有一下 2 種:

  • DOM:一次性将整個XML文檔加載進記憶體,比較适合解析小檔案
  • SAX:從根元素開始,按順序一個元素一個元素往下解析,比較适合解析大檔案

iOS 中的 XML 解析

  • 在 iOS 中,解析 XML 的手段有很多
    • 蘋果原生
      • NSXMLParser:SAX方式解析,使用簡單;
    • 第三方架構
      • libxml2:純 C 語言,預設包含在 iOS SDK 中,同時支援 DOM 和 SAX 方式解析;
      • GDataXML:DOM 方式解析,由 Google 開發,基于 libxml2;
  • XML 解析方式的選擇建議
    • 大檔案:NSXMLParser、libxml2
    • 小檔案:GDataXML、NSXMLParser、libxml2

NSXMLParser

  • 使用步驟:
// 傳入 XML 資料,建立解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 設定代理,監聽解析過程
parser.delegate = self;
// 開始解析
[parser parse];
           
  • NSXMLParser 采取的是 SAX 方式解析,特點是事件驅動,下面情況都會通知代理;
    • 當掃描到文檔(Document)的開始與結束;
    • 當掃描到元素(Element)的開始與結束;

NSXMLParserDelegate

  • 當掃描到文檔的開始時調用(開始解析)
- (void)parserDidStartDocument:(NSXMLParser *)parser
           
  • 當掃描到文檔的結束時調用(解析完畢)
- (void)parserDidEndDocument:(NSXMLParser *)parser
           
  • 當掃描到元素的開始時調用(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 配置

  • GDataXML 基于 libxml2 庫,得做以下配置
    • 導入 libxml2 庫
      JSON 和 XMLJSONXMLGDataXML
    • 設定 libxml2 的頭檔案搜尋路徑(為了能找到libxml2庫的所有頭檔案)

      在 Head Search Path 中加入 /usr/include/libxml2

    • 設定連結參數(自動連結 libxml2 庫)

      在 Other Linker Flags 中加入 -lxml2

  • 由于 GDataXML 是非 ARC 的,是以得設定編譯參數
JSON 和 XMLJSONXMLGDataXML

設定編譯參數

GDataXML 使用

  • GDataXML 中常用的類:
    • GDataXMLDocument:代表整個 XML 文檔;
    • GDataXMLElement
      • 代表文檔中的每個元素;

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

JSON 和 XML 比較

  • 同一份資料,既可以用 JSON 來表示,也可以用 XML 來表示;
  • 相比之下,JSON 的體積小于 XML,是以伺服器傳回給移動端的資料格式以JSON 居多;
    JSON 和 XMLJSONXMLGDataXML

繼續閱讀