JSON
1.JSON是一种轻量级的数据格式,一般都是用于数据交互
2.服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
3.JSON的格式很像OC中的字典和数组
{"name" : ["jim","jack","rose"] ,"age" : 10}
标准的JSON格式注意点:key必须用双引号
4.想要从JSON中挖掘数据,就得对JSON进行解析
JSON--->OC数据类型
5.对于JSON数据的解析,我们推荐用苹果原生:NSJSONSerialization(性能最好)
常用方法有:
JSON--->OC对象[我们称之为JSON数据序列化--一般转化成OC中的字典,或者数组. 具体根据传入的JSON数剧算]
+ (id)JSONObjectWithData:() options:(NSJSONReadingOptions)opt error:(NSError **)error
OC对象--->JSON数据[我们称之为JSON数据的反序列化--也就是将数据转换为JSON数据]
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError *)error
序列化
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 将相应数据data ,转换成json数据。
// 第一个参数: 需要转换的data
// 第二个参数:关于 数据显示后的一些配置
/*
NSJSONReadingMutableContainers = (1UL << 0),解析出来的数组和字典是可变的(可变容器)
NSJSONReadingMutableLeaves = (1UL << 1), 解析出来的字符串是可变的(ios7 以前用的)
NSJSONReadingAllowFragments = (1UL << 2) 被解析的数据 既不是字典 也不是字符串的时候
NSNumber,NSBOOLen NSNULL(对象,用于占位的),nil(0)
*/
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding ];
NSData *json = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error:nil];
NSLog(@"%@-----%@",str,json);
}];
#######反序列化
NSDictionary *dict = @{
@"name":@"小明",
@"age":@16,
@"schools":@[
@{@"小学":@"123"},
@{@"初中":@"456"},
@{@"大学":@"789"}
],
};
// 对象转换成 json ,
// 第一个参数:传入需要转换的对象
// 对象转换以后的排版方式,没什么意义
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:nil];
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
为了让序列化出来出来的数组,在控制台的打印清晰明了,于是重写了[NSDictionary,NSArray加分类, 然而可以直接写在一个.m文件中, 只是按照分类写法就行了, 一个文件中允许有两个@implementation ,但是不能嵌入式使用. 重写的方法在调用 NSLog时 会自动调用, 这个方法就是为了格式固定的,以及调试使用] - (NSString *)descriptionWithLocale:(id)locale
- (NSString *)descriptionWithLocale:(id)locale
#import <Foundation/Foundation.h>
@implementation NSDictionary (LXL)
- (NSString *)descriptionWithLocale:(id)locale
{
// 1.定义字符串保存的拼接结果。
NSMutableString *strMut = [NSMutableString string];
[strMut appendString:@"{\n"];
[self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[strMut appendFormat:@"\t%@:%@\n",key,obj];
}];
[strMut appendString:@"}\n"];
return strMut;
}
@end
@implementation NSArray (LXL)
- (NSString *)descriptionWithLocale:(id)locale
{
// 1.定义字符串保存的拼接结果。
NSMutableString *strMut = [NSMutableString string];
[strMut appendString:@"(\n"];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[strMut appendFormat:@"%@\n",obj];
}];
[strMut appendString:@")\n"];
return strMut;
}
@end
在项目中一般介绍到的JSON数据,都是将其转换成模型数据进行保存, 更有方便的方法,就是将其转换成plist文件保存在文件沙盒中, 方便读取. (这是关于文件的持久化的管理)
XML
基本介绍
1.全称:Extension Markup Language : 可扩展标记语言
2.交互数据格式 html语言 DOM标签组成
3.组成部分: 文档声明[相当于Html中的header], 元素
(Element),属性(Attribute)
解析方式:
DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合大文件的解析
iOS中的XML解析
解析方式: NSXMLParser(大小),使用方便 ,
三方框架GDataXML(小)
下面来介绍GDataXML的使用
1.GDataXML基于libxml2库, 必须导入libxml2库(添加依赖库)
2.因为GDataXML是非ARC,所以需要混编 ,混编方法
GDataXML中的常用类
1.GDataXMLDocument:带便整个XML文档
2.GDataXMLElement:代表文档中的每一个元素
使用attributeForName:
方法可以获取属性值
NSString *urlStr = @"http://120.25.226.186:32812/video?type=XML";
NSURL *url = [NSURL URLWithString:urlStr];
// 设置请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 发送异步请求,获取服务器数据
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 将接收到的数据转换为 xml文件
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
// 获取文档中的每一个元素(外层)
GDataXMLElement *element = document.rootElement;
// 打印验证所有元素
NSLog(@"%@",element);
// 获取 元素中的内容 (内层元素)
NSArray *elements = [element elementsForName:@"video"];
for (GDataXMLElement *element in elements) {
VideoModel *model = [[VideoModel alloc]init];
// 取出每一个子元素中的属性, 再给模型赋值保存数据
model.name = [element attributeForName:@"name"].stringValue;
model.url = [element attributeForName:@"url"].stringValue;
model.image = [element attributeForName:@"image"].stringValue;
model.length = [element attributeForName:@"length"].stringValue.intValue;
[self.videos addObject:model];
[self.tableView reloadData];
}
}];
下面来介绍NSXMLParser的使用
使用步骤
1.传入XML数据,创建解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:Data]
2.设置代理,监听解析过程
parser.delegate = self
3.开始解析
[parser parse]
NSXMLParser采用的是SAX方式解析,特点是事件驱动,下面情况都会通知代理
1.当扫描到文档Document的开始与结束
2.当扫描到元素Element的开始和结束
NSXMLParserDelegate的代理方法
1.当扫描到文档的开始时调用(开始解析)
- (void)parserDidStartDocument:(NSXMLParser *)parser
2.当扫描到文档的结束时调用(解析完毕)
- (void)parserDidEndDocument:(NSXMLParser *)parser
3.当扫描到元素开始时调用(attributeDict存放着元素的属性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) nsmespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
4.当扫描到元素的结束时调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName (NSString *)qName
在实际应用中的使用方法:
// 将解析的每一元素,进行转换,存储,可以存储在plist文件中,也可以保存在模型数据中
// 开始解析xml中的每一个元素,从大到小
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// 将解析到的字典属性, 进行模型转换
VideoModel *model = [VideoModel objectWithKeyValues:attributeDict];
// 将模型添加到模型数组
[self.videos addObject:model];
// 每添加一组,进行数据更新
[self.tableView reloadData];
}