JSON数据(NSData) -> OC对象(Foundation Object)
- JSON和OC对象转换后对应数据类型
- {} -> NSDictionary @{}
- [] -> NSArray @[]
- "jack" -> NSString @"jack"
- 10 -> NSNumber @10
- 10.5 -> NSNumber @10.5
- true -> NSNumber @1
- false -> NSNumber @0
- null -> NSNull
- 转换方法
// 利用NSJSONSerialization类
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
// 示例:
NSDictionary *dict = @{
@"name":@"lnj",
@"age":@10,
@"gender":@"man"
};
/*
第一个参数: 需要转换为JSON的对象
第二个参数: 转换为JSON之后是否需要排版
第三个参数: 错误信息
*/
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
NSString *temp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", temp);
<br />
OC对象(Foundation Object)-> JSON数据(NSData)
- 转换方法
// 利用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) {
/*
第一个参数: 需要转换的json数据
第二个参数: 告诉系统如何转换json数据
第三个参数: 错误信息
*/
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
}];
- NSJSONReadingOptions
- NSJSONReadingMutableContainers = (1UL << 0)
- 创建出来的数组和字典就是可变
- NSJSONReadingMutableLeaves = (1UL << 1)
- 数组或者字典里面的字符串是可变的, iOS7以后无效
- NSJSONReadingAllowFragments
- 允许解析出来的对象不是字典或者数组,比如直接是字符串或者NSNumber(如果服务器返回的JSON数据, 不是标准的JSON, 那么就必须使用这个值, 否则无法解析)
<br />
- 允许解析出来的对象不是字典或者数组,比如直接是字符串或者NSNumber(如果服务器返回的JSON数据, 不是标准的JSON, 那么就必须使用这个值, 否则无法解析)
- NSJSONReadingMutableContainers = (1UL << 0)
XML的解析
XML的解析方式有2种:
- DOM: 一次性将整个XML文档加载进内存,比较适合解析小文件
- SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
我们可以使用以下方法来解析
- iOS原生: NSXMLParser:SAX方式解析,使用简单
- 第三方 : libxml2,纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析<br />
选择建议
大文件:NSXMLParser、libxml2
小文件:GDataXML、NSXMLParser、libxml2
NSXMLParser的用法
- 创建解析器来解析
// 创建XML解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 设置代理
parser.delegate = self;
// 开始解析XML(parse方法是阻塞式的)
[parser parse];
- 代理对象要遵守NSXMLParserDelegate协议,实现代理方法
/**
* 解析到某个元素的结尾(比如解析</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];
// 获得根节点
doc.rootElement;
// 获得其他节点
[element elementsForName:@"video"];
// 获得节点的属性
[element attributeForName:@"name"].stringValue;
网友评论