標籤:
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 |
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
- JSONModel
- MJExtension
設計架構需要考慮的問題
二、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文檔的類型
最簡單的聲明
用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中的所有空格和換行,都會當做具體內容處理
<video> 小黃人</video>
7.一個元素可以擁有多個屬性
<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.蘋果原生
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使用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解析