1. JSON
JSON是网络上用来传输数据使用最广泛的数据格式;JSON是Javascript的子集,专门负责描述数据格式(Javascript是做网页开发使用的一种"脚本"语言,Javascript和Java没有任何关系!)
比XML更轻量级
1.1 语法规则
(1)数据以键值对(key/value)方式表示
(2)数据由逗号分隔
(3)花括号保存对象
(4)方括号保存数组
JSON描述对象的语法格式很像字典,但不是字典,仅仅是键值对的形式很像;
JSON表示单个对象:(字典里有@,JSON中没有@)
1.2 JSON值
(1)数字(整型、浮点型)
(2)字符串
(3)逻辑值(true或false)
(4)数组、对象
(5)null
序列化:在向服务器发送数据之前,将 NSArray
/ NSDictionary
转换成二进制的过程
反序列化:在从服务器接收到数据之后,将二进制数据转换成 NSArray
/ NSDictionary
1.3 数据解析(反序列化)
从服务器获取到的数据都是二进制数据,客户端无法直接使用,需要将二进制的数据转换为 客户端可以直接使用的OC对象
(1)苹果原生
NSJSONSerialization类
id result = [NSJSONSerialization JSONObjectWithData: options: error:];
NSLog(@"%@", [result class]);
<1>如果打印json类型的结果是_NSCFDictionary,表示字典(不可变的);
NSJSONSerialization 自动将二进制形式的JSON字符串,解析成了字典或数组;
JSON解析返回的对象是字典或数组,是根据原始数据是由{}或者[]括起来决定的。
<2>optins选项
NSJSONReadingMutableContainers = (1UL << 0) ---> 容器可变
NSJSONReadingMutableLeaves = (1UL << 1) ---> 叶子可变
NSJSONReadingAllowFragments = (1UL << 2) ---> 顶级节点可以不是 NSArray 或者 NSDictionary
通常options参数我们都填 0(默认不可变),表示任何附加操作都不做,效率最高!
这种错误表示JSON文件有错:
(2)JSONKit(MRC下的)
JSONKit已经在2012年停止更新,适用于 IOS 5.0 (原生的是在 5.0 开始有的)以前的版本开发使用
JSONKit反序列化核心代码:
id result = [[JSONDecoder decoder] objectWithData:data];
2. XML(可扩展标记语言)
XML被设计用来传输和存储数据;有且只有一个根节点;开始结点必须对应结束结点
2.1 解析方式
(1)DOM
是在 MAC 使用的解析方式;内存消耗极大,不适用于手机;iPhone无法直接使用 DOM 方式解析 XML
(2)SAX
是只读的方式,从上向下的方式解析;是苹果提供的解析方式;NSXMLParser 通过代理
实现解析;速度快
解析步骤:
- 开始文档 - 准备工作
- 开始"节点"
- 发现节点内部的内容,每一个节点,可能需要多次才能找完
- 结束"节点"
- 结束文档 - 解析结束
例子:
- (void)viewDidLoad {
[super viewDidLoad];
//1.URL
NSURL *url = [NSURL URLWithString:@"http://192.168.34.36/videos.xml"];
//2.NSURLRequest
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:30];
//3.建立连接,发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//4.得到服务器的响应数据,进行处理
if (connectionError==nil &&data!=nil &&data.length>0) {
//1.xml里面需要先搞一个xml解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//2.给我们的解析器设置代理
parser.delegate = self;
//3.开始解析
[parser parse];
}
}];
}
// 实现代理方法,开始解析
// 文档开始
- (void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"----开始文档---");
}
// 开始某个标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{
NSLog(@"start %@---",elementName);
}
// 当我们解析到内容的时候,把他多次打印的值,拼接字符串,可变字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"%@",string);
}
// 结束某个标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{
NSLog(@"end %@---",elementName);
}
// 文档结束
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"----结束文档---");
}
3. JSON和XML的区别
(1)JSON和XML的数据可读性基本相同
(2)XML有很好的可扩展性,JSON也有可扩展性
(3)XML的解析需要考虑父节点,子节点;JSON解析不需要考虑这些
(4)现在很多情况JSON解析用得比较多
(5)JSON的数据体积相对于XML会小一些