iOS - - JSON 和 XML解析

來源:互聯網
上載者:User

標籤:

JSON 和 XML一、JSON1.什麼是JSON
  • JSON是一種輕量級的資料格式,一般用於資料互動
  • 伺服器返回給用戶端的資料,一般都是JSON格式或者XML格式(檔案下載除外)
2.JSON的格式很像OC中的字典和數組
{"name" : "jack", "age" : 10}{"names" : ["jack", "rose", "jim"]}
  • 標準JSON格式的注意點:key必須用雙引號
  • 要想從JSON中挖掘出具體資料,得對JSON進行解析
JSON OC
大括弧{} NSDictionary
中括弧[] NSArray
雙引號"" NSString
數字 NSNumber
true/false NSNumber
null NSNull
  • JSON 轉換為 OC資料類型
3.在iOS中,JSON的常見解析方案有4種①第三方架構:JSONKit、SBJson、TouchJSON(效能從左至右,越差)②蘋果原生(內建):NSJSONSerialization(效能最好)NSJSONSerialization的常見方法JSON資料 -> OC對象
    /*    第一個參數:需要解析的JSON資料    第二個參數:解析JSON的可選配置參數     NSJSONReadingMutableContainers 解析出來的字典和數組是可變的     NSJSONReadingMutableLeaves 解析出來的對象中得字串是可變的,iOS7以後有問題     NSJSONReadingAllowFragments 解析出來的JSON資料既不是字典也不是數組,那麼就必須使用這個    */+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
iOS5內建解析類NSJSONSerialization從response中解析出資料放到字典中
    NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
OC對象 -> JSON資料
/*    第一個參數:需要轉換為JSON資料的OC對象    第二個參數:毫無意義    NSJSONWritingPrettyPrinted:對轉換之後的JSON進行排版*/+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
4.查看複雜的JSON資料①線上轉換,查看格式化

http://tool.oschina.net/codeformat/json

②直接將轉換後的資料寫到本地
NSDictionary *Dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];[dict writeToFile:@"路徑" atomically:YES];
5.JSON轉字典,字典再模型
  • Mantle
    • 所有的模型都必須繼承自MTModel
  • JSONModel
    • 所有的模型都必須繼承自JSONModel
  • MJExtension
    • 不需要強制繼承任何其他類
設計架構需要考慮的問題
  • 侵入性
    • 侵入性大就意味著很難離開這個架構
  • 易用性
    • 比較少量代碼實現N多功能
  • 擴充性
    • 很容易給這個架構增加新架構
二、XML1.什麼是XML
  • 全稱是Extensible Markup Language,譯作“可延伸標記語言 (XML)”
  • 跟JSON一樣,也是常用的一種用於互動的資料格式
  • 一般也叫XML文檔(XML Document)
2.XML舉例
<videos>    <video name="小黃人 第01部" length="30" />    <video name="小黃人 第02部" length="19" />    <video name="小黃人 第03部" length="33" /></videos>
3.一個常見的XML文檔一般由以下部分組成
  • 文檔聲明
  • 元素(Element)
  • 屬性(Attribute)
4.在XML文檔的最前面,必須編寫一個文檔聲明,用來聲明XML文檔的類型
  • 最簡單的聲明

    • <?xml version="1.0" ?>
  • 用encoding屬性說明文檔的字元編碼

    • <?xml version="1.0" encoding="UTF-8" ?>
5.一個元素包括了開始標籤和結束標籤
  • 擁有內容的元素:<video>小黃人</video>
  • 沒有內容的元素:<video></video>
  • 沒有內容的元素簡寫:<video/>
  • 一個元素可以嵌套若干個子項目(不能出現交叉嵌套)
<videos>    <video>        <name>小黃人 第01部</name>             <length>30</length>    </video></videos>
  • 規範的XML文檔最多隻有1個根項目,其他元素都是根項目的子孫元素
6.XML中的所有空格和換行,都會當做具體內容處理
  • 下面兩個元素的內容是不一樣的
    • 第1個
    • <video>小黃人</video>
  • 第2個
<video>    小黃人</video>
7.一個元素可以擁有多個屬性
  • <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" />
1.XML的解析方式有2種
  • DOM:一次性將整個XML文檔載入進記憶體,比較適合解析小檔案
  • SAX:從根項目開始,按順序一個元素一個元素往下解析,比較適合解析大檔案
iOS中的XML解析在iOS中,解析XML的手段有很多1.蘋果原生
  • NSXMLParser:SAX方式解析,使用簡單
2.第三方架構
  • libxml2:純C語言,預設包含在iOS SDK中,同時支援DOM和SAX方式解析
  • GDataXML:DOM方式解析,由Google開發,基於libxml2
XML解析方式的選擇建議
  • 大檔案:NSXMLParser、libxml2
  • 小檔案:GDataXML、NSXMLParser、libxml2
2.NSXMLParser
  • NSXMLParser採取的是SAX方式解析,特點是事件驅動,下面情況都會通知代理
    • 當掃描到文檔(Document)的開始與結束
    • 當掃描到元素(Element)的開始與結束
使用步驟①.開始解析
// 傳入XML資料,建立解析器NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];// 設定代理,監聽解析過程parser.delegate = self;// 開始解析(parse方法是阻塞式的)[parser parse];
②.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
3.GDataXML①GDataXML配置
  • GDataXML基於libxml2庫,得做以下配置
  • 匯入libxml2庫

  • 設定libxml2的標頭檔搜尋路徑(為了能找到libxml2庫的所有標頭檔)

    • 在Head Search Path中加入/usr/include/libxml2
  • 設定連結參數(自動連結libxml2庫)

    • 在Other Linker Flags中加入-lxml2
  • 由於GDataXML是非ARC的,因此得設定編譯參數

    • -fno-objc-arc
②GDataXML使用GDataXML中常用的類
  • GDataXMLDocument:代表整個XML文檔
GDataXMLElement
  • 代表文檔中的每個元素
  • 使用attributeForName:方法可以獲得屬性值
    // 1.建立URL    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];    // 2.根據URL建立Request    NSURLRequest *request = [NSURLRequest requestWithURL:url];    // 3.利用NSURLConnection發送請求    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {        // 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.videos addObject:video];        }        [self.tableView reloadData];    }];
四、JSON和XML比較
  • 同一份資料,既可以用JSON來表示,也可以用XML來表示
  • 相比之下,JSON的體積小於XML,所以伺服器返回給移動端的資料格式以JSON居多
五、利用蘋果官方API播放視頻
// 建立視頻播放器MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:urlStr]];// 顯示視頻[self presentViewController:vc animated:YES completion:nil];

iOS - - JSON 和 XML解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.