- JSON是一種輕量級(jí)的數(shù)據(jù)格式界牡,一般用于數(shù)據(jù)交互
- 服務(wù)器返回給客戶端的數(shù)據(jù)扣草,一般都是JSON格式或者XML格式(文件下載除外)
JSON的格式很像OC中的字典和數(shù)組
{"name": "jack","age": 10}
{"names": ["jack","rose","jim"]}
- 標(biāo)準(zhǔn)JSON格式的注意點(diǎn):key必須用雙引號(hào)
JSON的常見(jiàn)解析方案有4種
- 第三方框架:JSONKit才沧、SBJson样刷、TouchJSON(性能從左到右败去,越來(lái)越差)
- 蘋(píng)果原生(自帶):NSJSONSerialization(性能最好)
//JSON解析
-(void)jsonTOOc
{
//1.確定url
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dewr&pwd=sfrsf&type=JSON"];
//2.創(chuàng)建請(qǐng)求對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.發(fā)送GET請(qǐng)求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//4.解析JSON數(shù)據(jù)
/*
第一個(gè)參數(shù):要解析的json數(shù)據(jù)
第二個(gè)參數(shù):解析策略
NSJSONReadingMutableContainers = (1UL << 0), 最外層可變的數(shù)組或者是可變的字典
NSJSONReadingMutableLeaves = (1UL << 1), string是可變的 iOS7有問(wèn)題
!!! NSJSONReadingAllowFragments = (1UL << 2) 最外層既不是數(shù)組也不是字典
第三個(gè)參數(shù):error
*/
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict[@"error"]);
}];
}
XML的常見(jiàn)解析方案
- 全稱(chēng)是Extensible Markup Language,譯作“可擴(kuò)展標(biāo)記語(yǔ)言”
- 跟JSON一樣盗飒,也是常用的一種用于交互的數(shù)據(jù)格式
- 一般也叫XML文檔(XML Document)
XML舉例
<videos>
<videoname="大圣歸來(lái)"length="30"/>
<videoname="三打白骨精"length="19"/>
<videoname="哪吒鬧海"length="33"/>
</videos>
XML的常見(jiàn)解析方案有兩種
- DOM:一次性將整個(gè)XML文檔加載進(jìn)內(nèi)存嚷量,比較適合解析小文件
- SAX:從根元素開(kāi)始,按順序一個(gè)元素一個(gè)元素往下解析逆趣,比較適合解析大文件
在iOS中蝶溶,解析XML的手段有很多
蘋(píng)果原生
NSXMLParser:SAX方式解析,使用簡(jiǎn)單第三方框架
libxml2:純C語(yǔ)言汗贫,默認(rèn)包含在iOSSDK中身坐,同時(shí)支持DOM和SAX方式解析
GDataXML:DOM方式解析,由Google開(kāi)發(fā)落包,基于libxml2
XML解析方式的選擇建議
p大文件:NSXMLParser部蛇、libxml2
p小文件:GDataXML、NSXMLParser咐蝇、libxml2
用NSXMLParser解析XML
//1.確定請(qǐng)求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
//2.創(chuàng)建請(qǐng)求對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.使用NSURLConnection發(fā)送GET請(qǐng)求(異步)
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//4.解析服務(wù)器返回的數(shù)據(jù)
// NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
//4.1 創(chuàng)建一個(gè)XML解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//4.2 設(shè)置代理
parser.delegate = self;
//4.3 開(kāi)始解析
[parser parse];
一些常用的代理方法
pragma mark - NSXMLParserDelegate
//1.開(kāi)始解析XML文檔
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"parserDidStartDocument");
}
//2.開(kāi)始解析XML文檔中的某個(gè)元素,會(huì)被調(diào)用多次
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
//判斷是否是根元素
if ([elementName isEqualToString:@"videos"]) {
return;
}
NSLog(@"didStartElement---%@---%@",elementName,attributeDict);
//字典轉(zhuǎn)模型
//[self.videos addObject:[ZYHVideo mj_objectWithKeyValues:attributeDict]];
//第二種方式:
ZYHVideo *video = [[ZYHVideo alloc]init];
[video mj_setKeyValues:attributeDict];
[self.videos addObject:video];
}
//3.結(jié)束解析XML文檔中的某個(gè)元素,會(huì)被調(diào)用多次
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"didEndElement---%@",elementName);
}
//4.解析XML文檔結(jié)束
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"parserDidEndDocument");
}
使用GDataXML解析XML
- GDataXML基于libxml2庫(kù)涯鲁,得做以下配置
- 導(dǎo)入libxml2庫(kù)
- 設(shè)置libxml2的頭文件搜索路徑(為了能找到libxml2庫(kù)的所有頭文件)
- 在Head SearchPath中加入/usr/include/libxml2
- 設(shè)置鏈接參數(shù)(自動(dòng)鏈接libxml2庫(kù))
- 由于GDataXML是非ARC的,因此得設(shè)置編譯參數(shù)
//1.確定請(qǐng)求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
//2.創(chuàng)建請(qǐng)求對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.使用NSURLConnection發(fā)送GET請(qǐng)求(異步)
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//4.解析服務(wù)器返回的數(shù)據(jù)
//4.1 加載XML文檔
GDataXMLDocument *doc= [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
//4.2 需要拿到這個(gè)XML文檔的根元素,拿到根元素下面的所有名稱(chēng)為video的子元素
NSArray *eles = [doc.rootElement elementsForName:@"video"];
//4.3 遍歷eles ,完成數(shù)據(jù)的轉(zhuǎn)換
for (GDataXMLElement *ele in eles) {
XMGVideo *video = [[XMGVideo alloc]init];
video.name = [ele attributeForName:@"name"].stringValue;
video.ID = [ele attributeForName:@"id"].stringValue;
video.image = [ele attributeForName:@"image"].stringValue;
video.url = [ele attributeForName:@"url"].stringValue;
video.length = [ele attributeForName:@"length"].stringValue.integerValue;
[self.videos addObject:video];
}
//6.在主線程中刷新UI-TableView
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
[self.tableView reloadData];
}];
}];