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)的NSDictionary
和NSArray
是可變的 -
NSJSONReadingMutableLeaves
解析出來(lái)的對(duì)象中的NSString
是可變的, 不推薦使用挥转。(解析不出來(lái)。) -
NSJSONReadingAllowFragments
被解析的JSON數(shù)據(jù)的top-level
如果既不是NSDictionary
也不是NSArray
, 需使用該值. - 默認(rèn)值
0
orkNilOptions
-
- 編碼
JSON規(guī)范中列出的5種支持的編碼之一:UTF-8
绑谣、UTF-16LE
党窜、UTF-16BE
、UTF-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是
NSArray
或NSDictionay
以及他們派生出來(lái)的子類 - obj 包含的所有對(duì)象是
NSString
,NSNumber
,NSArray
,NSDictionary
或NSNull
- 字典中所有的key必須是
NSString
類型的 -
NSNumber
的對(duì)象不能是NaN
或無(wú)窮大
- obj是
-
NSJSONWritingOptions
-
NSJSONWritingPrettyPrinted
漂亮的排版幌衣。對(duì)轉(zhuǎn)換之后的JSON對(duì)象進(jìn)行排版 -
NSJSONWritingSortedKeys
ios11.0
之后使用,會(huì)對(duì)生成的數(shù)據(jù),按照key的字母大小進(jìn)行排序壤玫。數(shù)據(jù)一行顯示. - 默認(rèn)值
0
orkNilOptions
數(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/>
- 擁有內(nèi)容的元素:
- 一個(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
代理方法
- 創(chuàng)建一個(gè)解析器
-
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ù)
GDataXML的使用
GDataXML中常用的類
GDataXMLDocument
:代表整個(gè)XML文檔
elementsForName
:獲得元素GDataXMLElement
GDataXMLElement
:代表文檔中的每個(gè)元素
attributeForName
:獲得屬性值