亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS-JSon和Xml解析,與服務器交互數據的解析詳解與使用,各種解析方式詳解

2019-11-14 18:32:48
字體:
來源:轉載
供稿:網友

JSon和xml解析,與服務器交互必許學會

什么是JSon?什么是Xml?

在移動應用開發中,客戶端經常要與服務器進行交互,獲得服務器的數據,進行展示。那么獲取的數據的格式,就是JSon或者Xml格式(大多數),而現在,因為JSon格式的輕量級,和方便使用的特性,在市場占有中已經90%左右。

我們先學習一下JSon格式的數據

我們來看看JSon格式的數據長什么樣子:

```
{

   "access_token": "ACCESS_TOKEN",   "expires_in": 1234,   "remind_in":"798114",   "uid":"12341234"

}
```
這是一段新浪微博返回的JSon格式數據,是不是覺得樣子長得很像OC中的字典,對,沒錯,在iOS開發中我們也是要將這種數據轉化成OC的數據類型,方便我們使用。

在上面的數據中,我們注意到:JSon數據的key都有“”包裹,這說明你觀察的挺仔細的。這也是JSon數據的格式要求,那么,JSon數據怎么轉換成OC的數據類型呢???我們先看看他們之間的聯系吧。

你要是還不清楚這張圖在說什么,就看看下面的對應關系:

JSON數據(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

這下肯定知道什么意思了吧。

有了這個一一對應的關系,我們就能方便的進行轉換了。
JSon解析方法
---
性能最好的解析方法是:蘋果原生(自帶):NSJSONSerialization

也有第三方框架:JSONKit、SBJson、TouchJSON(性能從左到右,越來越差)

但是我們并不會都學,因為學那么多也不會都用得上,so...開始吧


我們來學習一下性能最好的解析方式:
NSJSONSerialization

常使用的方法是:


將JSON數據 -> 轉換成OC對象

+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

參數options詳解:

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

這樣干講是不是覺得學的不牢固,那么我們來試試例子學習吧:

例子

//請求服務器的數據    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];    NSURLRequest *request = [NSURLRequest requestWithURL:url];    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {        //查看原數據的類型        NSLog(@"原數據%@",data);        //對數據用NSJSONSerialization解析成OC數據類型        NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];        NSLog(@"轉換后的數據%@",dict);    }];

上面的例子你可以實現將服務器返回的數據轉換成OC的數據


將OC對象 -> 轉換成JSON數據

函數原型

+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

參數:NSJSONWritingPRettyPrinted 表示: 對轉換之后的JSON進行排版

舉例論證

//創建字典    NSDictionary *dict = @{                            @"name": @"xueyinliang",                            @"car":@"baoma",                            @"id":@1                           };    NSLog(@"%@",dict);    //將字典轉換成JSon數據    NSData *data =[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];    NSLog(@"%@",data);

打印結果:

2015-08-11 15:32:46.890 JSonAndOC[4767:149687] {    car = baoma;    id = 1;    name = xueyinliang;}2015-08-11 15:32:46.894 JSonAndOC[4767:149687] <7b0a2020 226e616d 6522203a 20227875 6579696e 6c69616e 67222c0a 20202263 61722220 3a202262 616f6d61 222c0a20 20226964 22203a20 310a7d>

這樣,我們就輕松學會了JSon和OC數據類型的轉換了。


xml數據的解析

雖然,JSon數據的市場應用占有率很大,但是我們還是要學習一下XML數據的解析。因為這種格式的數據還是有一些公司會用到的。

xml數據長什么樣子?

xml數據是一種可擴展的標記語言,因為它的每一個元素都是由特定的標記擴起來的。

例如:
每一個元素都有一個開始和結束標簽

<video>元素名</video>

元素可以嵌套子元素

<video>    <name>世界你好</name>    <length>30</length></video>

所有元素前面要有聲明

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

注意:這里的所有空格和換行,也是數據的一部分,會被處理。這也是為什么xml數據容量大的原因。

下面,我們來學習一下怎么解析xml數據,這才是重點。

XML數據的解析方式

  • XML的解析方式有2種

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

####然而,我們怎么選擇和怎么使用這兩種解析方式呢?

下面將給出選擇方案:(基于兩種方式的特點選擇)

  • XML解析方式的選擇建議

    • 大文件:NSXMLParser、libxml2
    • 小文件:GDataXML、NSXMLParser、libxml2

我們必須知道上面的這幾種方法各有什么特點,才會使用:

蘋果原生

NSXMLParser:SAX方式解析,使用簡單

第三方框架

libxml2:純C語言,默認包含在iOS SDK中,同時支持DOM和SAX方式解析GDataXML:DOM方式解析,由Google開發,基于libxml2

雖然libxml2可以同時支持dom和sax方式的解析,但是因為其使用麻煩,所以在實際開發中,并不常用,而是SAX方式解析大文件的時候使用NSXMLParser,DOM方式解析小文件的時候使用GDataXML或NSXMLParser。


XML解析的方式介紹過了,我們再來看看到底怎么使用他們吧。

首先是如何使用NSXMLParser

使用NSXMLParser解析數據很簡單,你只需要傳遞過來XML數據,然后在NSXMLParser的代理方法里面解析就好了。這時候NSXMLParser的代理方法會當讀到XML文件的開頭和結尾,以及讀到元素標簽的開始和結尾的時候通知代理,并調用相應的代理方法來執行。為了防止有朋友不清楚哪里是XML文件的開頭和結尾,哪里是元素的開頭和結尾,這里給出一張圖來明確表示一下:

下面給出代碼如何開始和如何設置代理方法:

// 傳入XML數據,創建解析器NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];// 設置代理,監聽解析過程parser.delegate = self;// 開始解析[parser parse];

代理方法

當掃描到文檔的開始時調用(開始解析)- (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/** *  解析發生錯誤時調用 */- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;

舉例

在獲取到網絡數據以后:

// 1.創建XML解析器NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];// 2.成為NSXMLParser的代理parser.delegate = self;// 3.開始解析XML[parser parse];

然后在代理方法中拿到數據:

/** *  開始解析XML文檔中的每一個元素時調用 */- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    // 2.videos    // 3.video    // 5.video    if ([elementName isEqualToString:@"videos"]) {        return;    }        XMGVideo *video = [XMGVideo objectWithKeyValues:attributeDict];//使用MJExtension轉換模型    [self.videos addObject:video];}

然后就可以拿到數據數組,進行各種顯示的操作了


接下來我們看看GDATAXML怎么使用

1,GDataXML基于libxml2庫,得做以下配置

  • 導入libxml2庫

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

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

  • 由于GDataXML是非ARC的,因此得設置編譯參數

GDataXML中常用的類

  • GDataXMLDocument:代表整個XML文檔

  • GDataXMLElement
    代表文檔中的每個元素

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

舉例

在獲取到網絡數據以后:

 // 1.加載所有的xml到內存中        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:kNilOptions error:nil];        // 2.獲取根元素        GDataXMLElement *rootElement = doc.rootElement;        // 3.從根元素中獲取所有子元素        NSArray *elements = [rootElement elementsForName:@"video"];        // 4.將子元素中的屬性轉換為模型        for (GDataXMLElement *ele in elements) {            XMGVideo *video = [[XMGVideo alloc] init];            video.image = [ele attributeForName:@"image"].stringValue;            video.url = [ele attributeForName:@"url"].stringValue;            video.name = [ele attributeForName:@"name"].stringValue;            video.length = @([ele attributeForName:@"length"].stringValue.integerValue);            [self.dataArray addObject:video];            //dataArray是數據的數組        }

然后就可以拿到數據數組,進行各種顯示的操作了

如果還有哪里不懂的,


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品偷拍一区二区三区在线看| 亚洲大胆人体视频| 欧美—级a级欧美特级ar全黄| 中文字幕欧美在线| 欧美成人第一页| 国产日韩欧美电影在线观看| 国产精品网红直播| 91免费看片网站| 欧美视频在线看| 国产日韩亚洲欧美| 91香蕉国产在线观看| 大胆欧美人体视频| 国产精品久久久久aaaa九色| 亚洲人成在线一二| 乱亲女秽乱长久久久| 日韩一区二区精品视频| 中文字幕免费精品一区高清| 亚洲第一区在线观看| 久久国产精品偷| 欧美日韩成人在线观看| 视频在线观看一区二区| 亚洲桃花岛网站| 久久久久久久久久av| 亚洲国产精品国自产拍av秋霞| 久久久国产一区二区三区| 亚洲黄色免费三级| 爽爽爽爽爽爽爽成人免费观看| 国产视频综合在线| 久久韩国免费视频| 亚洲九九九在线观看| 亚洲欧美另类国产| 久久人人爽人人| 97久久久久久| 北条麻妃99精品青青久久| 亚洲欧美日韩第一区| 成人免费高清完整版在线观看| 国产成人精品国内自产拍免费看| www国产亚洲精品久久网站| 一区二区欧美在线| 91夜夜未满十八勿入爽爽影院| 日韩三级成人av网| 狠狠爱在线视频一区| 久久在线视频在线| 中文字幕av日韩| 久久精品99国产精品酒店日本| 伊人久久久久久久久久久| 一区二区三区天堂av| 欧美成人免费一级人片100| 九九热精品视频在线播放| 日韩精品视频在线观看网址| 一区二区三区在线播放欧美| 亚洲午夜未满十八勿入免费观看全集| 色综合久久精品亚洲国产| 欧美午夜丰满在线18影院| 久久久999精品免费| 国内精品模特av私拍在线观看| 欧美日韩国产黄| 日韩欧美精品中文字幕| 91精品国产91久久久久久吃药| 精品av在线播放| 成人免费视频在线观看超级碰| 久久精品视频网站| 欧美日韩日本国产| 亚洲欧美制服中文字幕| 成年无码av片在线| 91精品国产91久久久久久久久| 久久精品一本久久99精品| 国产精品99久久久久久www| 亚洲一区二区三区在线视频| 久久伊人精品一区二区三区| 国产精品人人做人人爽| 91精品国产91久久久久久不卡| 成人亲热视频网站| 日韩免费视频在线观看| 国语自产精品视频在免费| 国产免费一区二区三区香蕉精| 国产拍精品一二三| 日韩av最新在线观看| 精品毛片三在线观看| 国产+人+亚洲| 欧美日韩激情美女| 国产午夜精品全部视频在线播放| 午夜精品久久久久久久久久久久久| 草民午夜欧美限制a级福利片| 精品亚洲一区二区三区四区五区| 91色视频在线导航| 欧美黄网免费在线观看| 成人福利网站在线观看| 色偷偷av一区二区三区| 欧美激情一区二区久久久| 亚洲欧美日韩在线一区| 亚洲视频专区在线| 亚洲国产欧美精品| 国产精品久久久久久久久久| 欧美日韩在线第一页| 欧美激情一区二区三区成人| 91av在线免费观看| 亚州成人av在线| 久久精品国产清自在天天线| 久久在线视频在线| 欧美性xxxxx极品| 亚洲性69xxxbbb| 亚洲午夜未删减在线观看| 伊人成人开心激情综合网| 久久久久久av| 中文字幕亚洲无线码a| 日韩电视剧在线观看免费网站| 91tv亚洲精品香蕉国产一区7ujn| 日韩网站在线观看| 国产精品jvid在线观看蜜臀| 成人啪啪免费看| 国产成人精品久久二区二区91| 欧美日韩亚洲高清| 欧美高清视频在线| 欧美日韩精品国产| 国产精品99久久久久久久久久久久| 精品成人在线视频| 久久99青青精品免费观看| 欧美综合激情网| 国产视频精品va久久久久久| 国语自产精品视频在线看抢先版图片| 国产91九色视频| 亚洲国产成人91精品| 日本精品免费一区二区三区| 日韩电影免费观看中文字幕| 成人免费福利在线| 欧美激情影音先锋| 亚洲成**性毛茸茸| 色小说视频一区| 九九久久国产精品| 九九热在线精品视频| 欧美最顶级丰满的aⅴ艳星| 国产精品视频最多的网站| 国产欧美va欧美va香蕉在| 日本不卡高字幕在线2019| 精品欧美aⅴ在线网站| 狠狠色狠狠色综合日日小说| 亚洲香蕉伊综合在人在线视看| 欧美特黄级在线| 欧美激情一区二区三区久久久| 国产精品一区二区性色av| 免费成人高清视频| 欧美激情a在线| 日本久久久久亚洲中字幕| 亚洲美女黄色片| 丰满岳妇乱一区二区三区| 中文字幕综合一区| 日韩中文字幕在线播放| 国产女精品视频网站免费| 5566日本婷婷色中文字幕97| 成人黄色生活片| 免费97视频在线精品国自产拍| 91影院在线免费观看视频| 在线看日韩av| 亚洲人成欧美中文字幕| 久久99热精品这里久久精品| 久久久91精品| 日韩大陆毛片av| 亚洲女人天堂色在线7777| 97精品在线观看| 精品亚洲一区二区三区四区五区| 亚洲一区二区三区sesese| 日韩电视剧在线观看免费网站| 久久这里有精品视频|