iOS开发之JSON & XML
1、概述
JSON
(1) 作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式
(2) 基于JavaScript的一个子集
(3) 易读性略差,编码手写难度大,数据量小
(4) JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,我们会陷入繁琐复杂的数据节点查找中
XML
(1)可扩展标记语言
(2)用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
(3)易读性高,编码手写难度小,数据量大
客户端与服务器数据传输示意图:
2、JSON格式说明
n 对象
n {}
n 格式 {key : value, key : value,...} 的键值对的结构
n 可以反序列化为OC中的NSDictionary
n 数组
n []
n 格式 ["java","javascript","vb",...]
n 可以反序列化为OC中的NSArray
n 提示
n JSON的数据格式与OC中的快速包装方法非常类似
n JSON的数据格式同样支持嵌套
3、解析服务器端返回JSON数据
n 从iOS 5开始,使用NSJSONSerialization对JSON解析
n 其他常见的三种JSON解析第三方库:
n SBJson 因为API简单易用,可能还会有一些应用中留存
n JSONKit JSONKit的开发者称:JSONKit的性能优于苹果
n TouchJson
4、JSON的序列化和反序列化
反序列化
[NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
例如:
- (void)getLogon2
{
[self.view endEditing:YES];
// 1. URL
NSString *urlStr =
[NSString stringWithFormat:@"http://192.168.40.2/
login.php?username=%@&password=%@", self.userName.text, self.userPwd.text];
// 如果URL中包含中文字符或者特殊字符,例如空格,需要添加百分号转义
urlStr =
[urlStr stringByAddingPercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
// 2. NSURLRequest
/**
参数:
timeoutInterval:开发中一定要指定超时时长,默认60秒,通常靠考虑到用户的网络环境,可以设置到10~20秒,不能太长,也不能太短
*/
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:5.0f];
// 3. 发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:
[[NSOperationQueue alloc] init] completionHandler:
^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
[self showAlertViewWithMsg:@"网络不给力"];
return;
} else {
// 将接收到的二进制数据反序列化为数据字典
NSDictionary *dict =
[NSJSONSerialization JSONObjectWithData:data
options:nil error:NULL];
LoginUser *user = [[LoginUser alloc] initWithDict:dict];
// 如果用户有头像就加载头像
if (user.userImage) {
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image =
[user loadImageWithURL:user.userImage];
});
}
// 用户登录错误?不会网络连接失败!
if (!user.userId) {
[self showAlertViewWithMsg:@"用户名或者密码不正确"];
return;
}
[[NSOperationQueue mainQueue]
addOperationWithBlock:^{
self.logonResult.text = @"登录完成";
}];
}
}];
}
序列化
[NSJSONSerialization dataWithJSONObject:array options:0 error:NULL];
5、NSXMLParser
1、NSXMLParser解析方法
n NSXMLParser是SAX方法解析
n SAX(Simple API for XML)
n 只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
n 常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
n 从文档的开始通过每一节点移动,定位一个特定的节点
n DOM(Document Object Model)
n 不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
n 一般应用与小型的配置XML,方便操作
n 为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
n 在内存中生成节点树操作代价昂贵
1、 解析步骤:
【备注】属性:
@property (nonatomic, strong) NSMutableArray *dataList;
// 来回拼接
@property (nonatomic, strong) NSMutableString *elementString;
// 当前视频信息的对象
@property (nonatomic, strong) Video *v;
还要遵守代理协议:NSXMLParserDelegate
示例代码:
- (IBAction)loadData
{
// 1. URL
NSURL *url =
[NSURL URLWithString:@"http://localhost/videos.php"];
// 2. Request
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10.0f];
// 3. 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:
[[NSOperationQueue alloc] init]completionHandler:
^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//第一步:实例化NSXMLParser,传入从服务器接收的XML数据
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//第二步:定义解析器代理
parser.delegate = self;
//第三步:解析器解析
[parser parse];
}];
}
//第四步:通过解析代理方法完成XML数据的解析
#pragma mark 1. 开始
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
// 准备工作
// 1> dataList
if (!self.dataList) {
self.dataList = [NSMutableArray array];
} else {
[self.dataList removeAllObjects];
}
// 2> elementString
if (!self.elementString) {
self.elementString = [NSMutableString string];
} else {
// 清空可变字符串不要设置成nil,使用setString只是清空内容,下次不会再次实例化
[self.elementString setString:@""];
}
}
#pragma mark 2. 所有开始一个节点:<element>
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// 如果是<video>新建对象
if ([elementName isEqualToString:@"video"]) {
self.v = [[Video alloc] init];
self.v.videoId = attributeDict[@"videoId"];
}
// 每开始一个新节点之前都清空elementString
// 避免上一次的结果被重复拼接
[self.elementString setString:@""];
}
#pragma mark 3. 查找内容,可能会重复多次
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// 拼接字符串
[self.elementString appendString:string];
}
#pragma mark 4. 节点结束 </element>
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"结束节点 %@", elementName);
// 判断如果是<name>要复制
if ([elementName isEqualToString:@"video"]) {
[self.dataList addObject:self.v];
} else if (![elementName isEqualToString:@"videos"]) {
[self.v setValue:self.elementString forKey:elementName];
}
}
#pragma mark 5. 文档结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"解析结束 %@ %@", self.dataList, [NSThread currentThread]);
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
// 关闭刷新控件的刷新
[self.refreshControl endRefreshing];
});
}
#pragma mark 6. 出错处理
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"%@", parseError.localizedDescription);
}
3、NSXMLParser解析代理方法
// 1. 开始解析XML文档
- (void)parserDidStartDocument:
// 2. 开始解析某个元素,会遍历整个XML,识别元素节点名称
- (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:
// 3. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销
- (void)parser:foundCharacters:
// 4. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息
- (void)parser:didEndElement:namespaceURI:qualifiedName:
注意:在解析过程中,2、3、4三个方法会不停的重复执行,直到遍历完成为止
// 5. 解析XML文档结束
- (void)parserDidEndDocument:
// 6. 解析出错
- (void)parser:parseErrorOccurred:
iOS开发之JSON & XML的更多相关文章
- iOS开发之JSON格式数据的生成与解析
本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...
- 转载 -- iOS开发之JSON格式数据的生成与解析
本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...
- iOS开发之JSON解析
JSON解析步骤: - (NSArray *)products { if (_products == nil) { //第一步:获取JSON文件的路径: NSString *path = [[NSBu ...
- iOS开发之JSON转PLIST(把存储json格式的文件转换成plist文件)
p.p1 { margin: 0.0px 0.0px 0.0px 60.0px; font: 16.0px "PingFang SC"; color: #586e75 } p.p2 ...
- iOS开发之info.pist文件和.pch文件
iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...
- 李洪强IOS开发之iOS好项目收集
李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...
- 李洪强iOS开发之iOS技术博客
李洪强iOS开发之iOS技术博客 注意:访问博客请直接点击博客,不要点击后面的RSS地址 博客地址 RSS地址 南峰子的技术博客 剑尖博客 图拉鼎 Henry Lee Dev Talk ...
- iOS开发之MVVM在项目中的应用
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
随机推荐
- (@WhiteTaken)设计模式学习——工厂方法模式
这个工厂方法模式,是简单工厂的延伸,不同点在于,将某个具体的类继续细分,将核心部分抽象成一个接口.而简单工厂,把核心写在了一个类上,不利于拓展. 举个例子,简单工厂中有苹果类,香蕉类,我们创建了一个F ...
- CSS中:visited的隐私保护
CSS 伪类 (Pseudo-classes) 锚伪类:在支持 CSS 的浏览器中,链接的不同状态都可以不同的方式显示,这些状态包括:活动状态,已被访问状态,未被访问状态,和鼠标悬停状态. a:lin ...
- ArcGIS制图表达Representation-制图表达介绍
ArcGIS制图表达技术-制图表达介绍 by 李远祥 在基于GIS数据的制图中,大部分都是使用的数据+符号应用的这种模式.这种模式已经被应用很多年,而且也是非常成熟.对应在ArcGIS体系里面,就是数 ...
- cordova StatusBar插件的使用(设置手机状态栏颜色和页面头部颜色一致),做出和原生一样的页面效果体验
cordova StatusBar插件的使用(设置手机状态栏颜色和页面头部颜色一致),做出和原生一样的页面效果体验设置设备状态栏背景颜色StatusBar.backgroundColorByHexSt ...
- synchronized的使用及注意事项
主要来源:http://blog.csdn.net/luoweifu/article/details/46613015 1.synchronized(this) void method(){ sync ...
- 【死磕Java并发】-----Java内存模型之happend-before
在上篇博客([死磕Java并发]-–深入分析volatile的实现原理)LZ提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题.那么我们正确使用同步.锁的情况下 ...
- linux系统盘使用率达到100%的问题查找和解决方法
今天公司云服务器报警系统发来短信,系统磁盘空间不够,登录服务器进行查看,磁盘使用虑达到100%, 感觉比较奇怪,所存的东西并不多,怎么会将磁盘占满,而且数据都是存在数据盘下,通过简单的进行 ...
- Ubuntu纯字符界面的一些设置
由于Ubuntu的纯字符界面不支持中文显示,所以进行了一些配置,为了更好的显示 1. 把环境语言配置为英文 在用户目录下的".bashrc"文件的结尾处添加以下内容,然后重新登录 ...
- cloudbase-init 自动扩盘的副作用 - 每天5分钟玩转 OpenStack(154)
这是 OpenStack 实施经验分享系列的第 4 篇. cloudbase-init 的一项功能是自动扩展 windows 的 C 盘.比如 windows 镜像是 20G,在部署 instance ...
- Omi实战-QQ附近用户列表Web页
原文地址https://github.com/AlloyTeam/omi/blob/master/docs/cn_pr_nearby.md 写在前面 Omi很适合大型复杂的Web页面开发,例如一些We ...