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的常見解析方案

NSJSONSerialization

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

解析JSON

NSJSONSerialization的常見方法

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

    + (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
    
    • NSJSONReadingOptions
      • NSJSONReadingMutableContainers 解析出來的NSDictionaryNSArray是可變的
      • NSJSONReadingMutableLeaves 解析出來的對(duì)象中的NSString是可變的, 不推薦使用。(解析不出來。)
      • NSJSONReadingAllowFragments 被解析的JSON數(shù)據(jù)的top-level 如果既不是NSDictionary也不是NSArray, 需使用該值.
      • 默認(rèn)值0orkNilOptions
    • 編碼
      JSON規(guī)范中列出的5種支持的編碼之一:UTF-8UTF-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 以及他們派生出來的子類
      • obj 包含的所有對(duì)象是NSString,NSNumber,NSArray,NSDictionaryNSNull
      • 字典中所有的key必須是NSString類型的
      • NSNumber的對(duì)象不能是NaN或無窮大
    • 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 不需要繼承,無代碼侵入性
  • YYModel不需要繼承,無代碼侵入性、高性能

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

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

XML的解析

什么是XML

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

XML語(yǔ)法

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

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

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

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

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

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

  • 一個(gè)元素包括了開始標(biāo)簽和結(jié)束標(biāo)簽
    • 擁有內(nèi)容的元素:< name >菜式菜品</name >
    • 沒有內(nèi)容的元素:< name ></name >
    • 沒有內(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)'' 括住

  • 屬性表示的信息也可以用子元素來表示,比如

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

解析XML

XML的解析方式有2種

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

iOS中的XML的解析方案

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

NSXMLParser

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

  • 解析步驟:
    • 創(chuàng)建一個(gè)解析器
      NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    • 設(shè)置代理NSXMLParserDelegate
      parser.delegate = self;
    • 開始解析
      [parser parse];
    • 實(shí)現(xiàn) NSXMLParserDelegate代理方法
  • NSXMLParser采取的是SAX方式解析,以下事件會(huì)通知代理
    • 當(dāng)掃描到文檔(Document)的開始與結(jié)束
    • 當(dāng)掃描到元素(Element)的開始與結(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容