IOS中四种json解析效率比较
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式。
有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接)。此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便。
从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的ios版本,可以使用第三方库来解析Json。
本文将介绍TouchJson、 SBJson 、JSONKit 和 iOS5所支持的原生的json方法,解析国家气象局API,TouchJson和SBJson需要下载他们的库
TouchJson包下载: http://download.csdn.net/detail/enuola/4523169
SBJson 包下载: http://download.csdn.net/detail/enuola/4523177
JSONKit包下载:http://download.csdn.net/detail/enuola/4523160
下面的完整程序源码包下载:http://download.csdn.net/detail/enuola/4523223
http://www.weather.com.cn/data/sk/101010100.html
http://www.weather.com.cn/data/cityinfo/101010100.html
http://m.weather.com.cn/data/101010100.html
首先建立一个新的工程,(注意不要选择ARC机制)添加如下控件:
- #import <UIKit/UIKit.h>
- @interface ViewController : UIViewController
- @property (retain, nonatomic) IBOutlet UITextView *txtView;
- - (IBAction)btnPressTouchJson:(id)sender;
- - (IBAction)btnPressSBJson:(id)sender;
- - (IBAction)btnPressIOS5Json:(id)sender;
- - (IBAction)btnPressJsonKit:(id)sender;
- @end
文件ViewController.m中主要代码:
(1)使用TouchJSon解析方法:(需导入包:#import "TouchJson/JSON/CJSONDeserializer.h")
- //使用TouchJson来解析北京的天气
- - (IBAction)btnPressTouchJson:(id)sender {
- //获取API接口
- NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"];
- //定义一个NSError对象,用于捕获错误信息
- NSError *error;
- NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
- NSLog(@"jsonString--->%@",jsonString);
- //将解析得到的内容存放字典中,编码格式为UTF8,防止取值的时候发生乱码
- NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:&error];
- //因为返回的Json文件有两层,去第二层内容放到字典中去
- NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
- NSLog(@"weatherInfo--->%@",weatherInfo);
- //取值打印
- txtView.text = [NSString stringWithFormat:@"今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];
- }
(2)使用SBJson解析方法:(需导入包:#import "SBJson/SBJson.h")
- //使用SBJson解析南阳的天气
- - (IBAction)btnPressSBJson:(id)sender {
- NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101180701.html"];
- NSError *error = nil;
- NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
- SBJsonParser *parser = [[SBJsonParser alloc] init];
- NSDictionary *rootDic = [parser objectWithString:jsonString error:&error];
- NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
- txtView.text = [NSString stringWithFormat:@"今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];
- }
(3)使用IOS5自带解析类NSJSONSerialization方法解析:(无需导入包,IOS5支持,低版本IOS不支持)
- - (IBAction)btnPressIOS5Json:(id)sender {
- NSError *error;
- //加载一个NSURL对象
- NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.weather.com.cn/data/101180601.html"]];
- //将请求的url数据放到NSData对象中
- NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
- //IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
- NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
- NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"];
- txtView.text = [NSString stringWithFormat:@"今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];
- NSLog(@"weatherInfo字典里面的内容为--》%@", weatherDic );
- }
(4)使用JSONKit的解析方法:(需导入包:#import "JSONKit/JSONKit.h")
- - (IBAction)btnPressJsonKit:(id)sender {
- //如果json是“单层”的,即value都是字符串、数字,可以使用objectFromJSONString
- NSString *json1 = @"{\"a\":123, \"b\":\"abc\"}";
- NSLog(@"json1:%@",json1);
- NSDictionary *data1 = [json1 objectFromJSONString];
- NSLog(@"json1.a:%@",[data1 objectForKey:@"a"]);
- NSLog(@"json1.b:%@",[data1 objectForKey:@"b"]);
- [json1 release];
- //如果json有嵌套,即value里有array、object,如果再使用objectFromJSONString,程序可能会报错(测试结果表明:使用由网络或得到的php/json_encode生成的json时会报错,但使用NSString定义的json字符串时,解析成功),最好使用objectFromJSONStringWithParseOptions:
- NSString *json2 = @"{\"a\":123, \"b\":\"abc\", \"c\":[456, \"hello\"], \"d\":{\"name\":\"张三\", \"age\":\"32\"}}";
- NSLog(@"json2:%@", json2);
- NSDictionary *data2 = [json2 objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
- NSLog(@"json2.c:%@", [data2 objectForKey:@"c"]);
- NSLog(@"json2.d:%@", [data2 objectForKey:@"d"]);
- [json2 release];
- }
另外,由于iOS5新增了JSON解析的API,我们将其和其他五个开源的JSON解析库进行了解析速度的测试,下面是测试的结果。
我们选择的测试对象包含下面的这几个框架,其中NSJSONSerialization是iOS5系统新增的JSON解析的API,需要iOS5的环境,如果您在更低的版本进行测试,应该屏蔽相应的代码调用。
- [SBJSON (json-framework)](http://code.google.com/p/json-framework/)
- [TouchJSON (from touchcode)](http://code.google.com/p/touchcode/)
- [YAJL (objective-C bindings)](http://github.com/gabriel/yajl-objc)
- [JSONKit](https://github.com/johnezang/JSONKit)
- [NextiveJson](https://github.com/nextive/NextiveJson)
-[NSJSONSerialization](http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40010946)
我们选择了四个包含json格式的数据的文件进行测试。每一个文件进行100的解析动作,对解析的时间进行比较。
.....
测试的结果显示,系统的API的解析速度最快,我们在工程项目中选择使用,也是应用较为广泛的SBJSON的解析速度为倒数第二差,令我大跌眼镜。
与系统API较为接近的应该是JSONKit。
这里没有对API的开放接口和使用方式进行比较,若单纯基于以上解析速度的测试:
1:iOS5应该选择系统的API进行
2:不能使用系统API的应该选择JSONKit
IOS中四种json解析效率比较相关推荐
- java中的json_JAVA中的四种JSON解析方式详解
JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...
- Java中四种XML解析技术之不完全测试
Java中四种XML解析技术之不完全测试 <script language=javascript src=""></script> 在平时工作中,难免会遇到 ...
- java四种xml_Java中四种XML解析技术
转载自 http://www.it.com.cn/f/edu/053/27/93819.htm 在平时工作中,难免会遇到把 XML 作为数据存储格式.面对目前种类繁多的解决方案,哪个最适合我们呢?在这 ...
- 深入 Go 中各个高性能 JSON 解析库
深入 Go 中各个高性能 JSON 解析库 转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算 ...
- IOS的四种数据存储方式及优劣
IOS有四种经常使用数据存储方式: 第一种方法:用NSUserDefaults存储配置信息 NSUserDefaults被设计用来存储设备和应用的配置信息.它通过一个工厂方法返回默认的.也是最经常使用 ...
- 微信小程序四种json配置文件详解
知识点: app.json配置文件 project.config.json配置文件 sitemap.json配置文件 页面文件夹中的.json配置文件 上片文章讲到 微信小程序有四种json配置文件, ...
- Android中四种补间动画的使用示例(附代码下载)
场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的 ...
- JavaScript中四种不同的属性检测方式比较
JavaScript中四种不同的属性检测方式比较 1. 用in方法 var o = {x:1}; "x" in o; //true "y" in o; //fa ...
- C++中四种 cast 转换
四种 cast 转换 C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast const_cast static_cas ...
最新文章
- 获取AFP共享的文件夹及其权限
- Cocos2d-x3.0 不规则Button
- 关于Android中工作者线程的思考
- 2021中超1 1006 xor sum
- 大数据WEB阶段(七)JDBC、数据库批处理、数据库连接池
- SQLServer删除登录帐户
- 牛客 - Shortest Common Non-Subsequence(dp+序列自动机)
- 哪里有mysql认证_国内哪个城市可以考mysql认证
- jeecg-framework-3.3.2-RELEASE 最新版本发布
- 从淘宝CFO到接棒马云 张勇是如何在12年里成为阿里董事局主席的
- 《Spring Boot官方指南》28.安全
- UIWebView关于XMLHttpRequest的内存泄漏
- spring实战(第四版)读书笔记 附电子书网盘链接
- Ubuntu输入简体中文变成繁体
- 互联网日报 | 张朝阳宣布2020年搜狐已盈利;永辉超市达成千店目标;腾讯云原生注册用户规模超100万...
- 循环队列以数组Q【0,...,m-1】存储结构,rear表示循环队列中的队尾元素的实际位置,移动按rear=(rear+1)/MODm,length表示当前循环队列中的元素个数,循环队列队首实际位置。
- 牛顿法求解柯西分布参数的最大似然估计(P055)
- 巴别鱼雏形,谷歌推出端到端语音翻译技术,还能模仿你说话
- 问题:设计一个大学教师和学生管理程序, 教师包括 编号、姓名、职称和教研室 数据的输入输出; 大学生包括编号、姓名、性别、班号、英语、高等数学和数据结构三门课程成绩的输入输出和计算平均分; 研究生包
- Django+redis+celery实现异步任务
热门文章
- 【小白学习C++ 教程】十五、C++ 中的template模板和泛型
- 安装hmmlearn
- debian部署mysql和tomcat_【超级详细】在Debian/kali/linux服务器下搭建Tomcat7+mysql+jdk8环境...
- Vue 学习 之 7.01 学习笔记
- WGAN新方案:通过梯度归一化来实现L约束
- “悟道”公开课第四讲丨悟道开发案例:​悟空策论——议论文写作平台
- BERT模型蒸馏有哪些方法?
- 漫谈强化学习中的引导搜索策略
- POJ2318 TOYS / POJ2398Toy Storage判断点与直线位置关系 【计算几何】
- 项目--------------使用BiLSTMCRF将病例文本中的诊断数据识别出来