JSON數(shù)據(jù)(NSData) -> OC對象(Foundation Object)
- JSON和OC對象轉(zhuǎn)換后對應數(shù)據(jù)類型
- {} -> NSDictionary @{}
- [] -> NSArray @[]
- "jack" -> NSString @"jack"
- 10 -> NSNumber @10
- 10.5 -> NSNumber @10.5
- true -> NSNumber @1
- false -> NSNumber @0
- null -> NSNull
- 轉(zhuǎn)換方法
// 利用NSJSONSerialization類
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
// 示例:
NSDictionary *dict = @{
@"name":@"lnj",
@"age":@10,
@"gender":@"man"
};
/*
第一個參數(shù): 需要轉(zhuǎn)換為JSON的對象
第二個參數(shù): 轉(zhuǎn)換為JSON之后是否需要排版
第三個參數(shù): 錯誤信息
*/
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
NSString *temp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", temp);
<br />
OC對象(Foundation Object)-> JSON數(shù)據(jù)(NSData)
- 轉(zhuǎn)換方法
// 利用NSJSONSerialization類
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
// 示例:
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/login?username=baidu&pwd=123&type=JSON"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
/*
第一個參數(shù): 需要轉(zhuǎn)換的json數(shù)據(jù)
第二個參數(shù): 告訴系統(tǒng)如何轉(zhuǎn)換json數(shù)據(jù)
第三個參數(shù): 錯誤信息
*/
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
}];
- NSJSONReadingOptions
- NSJSONReadingMutableContainers = (1UL << 0)
- 創(chuàng)建出來的數(shù)組和字典就是可變
- NSJSONReadingMutableLeaves = (1UL << 1)
- 數(shù)組或者字典里面的字符串是可變的, iOS7以后無效
- NSJSONReadingAllowFragments
- 允許解析出來的對象不是字典或者數(shù)組,比如直接是字符串或者NSNumber(如果服務器返回的JSON數(shù)據(jù), 不是標準的JSON, 那么就必須使用這個值, 否則無法解析)
<br />
- 允許解析出來的對象不是字典或者數(shù)組,比如直接是字符串或者NSNumber(如果服務器返回的JSON數(shù)據(jù), 不是標準的JSON, 那么就必須使用這個值, 否則無法解析)
- NSJSONReadingMutableContainers = (1UL << 0)
XML的解析
XML的解析方式有2種:
- DOM: 一次性將整個XML文檔加載進內(nèi)存,比較適合解析小文件
- SAX:從根元素開始,按順序一個元素一個元素往下解析,比較適合解析大文件
我們可以使用以下方法來解析
- iOS原生: NSXMLParser:SAX方式解析,使用簡單
- 第三方 : libxml2,純C語言,默認包含在iOS SDK中,同時支持DOM和SAX方式解析<br />
選擇建議
大文件:NSXMLParser、libxml2
小文件:GDataXML、NSXMLParser、libxml2
NSXMLParser的用法
- 創(chuàng)建解析器來解析
// 創(chuàng)建XML解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 設置代理
parser.delegate = self;
// 開始解析XML(parse方法是阻塞式的)
[parser parse];
- 代理對象要遵守NSXMLParserDelegate協(xié)議,實現(xiàn)代理方法
/**
* 解析到某個元素的結尾(比如解析</videos>)
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
}
/**
* 解析到某個元素的開頭(比如解析<videos>)
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
}
/**
* 開始解析XML文檔
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
}
/**
* 解析完畢
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
}
GDataXML的用法
- 配置


-
設置非ARC標記
具體用法
// 加載整個文檔
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 獲得根節(jié)點
doc.rootElement;
// 獲得其他節(jié)點
[element elementsForName:@"video"];
// 獲得節(jié)點的屬性
[element attributeForName:@"name"].stringValue;
