一、各种iOS JSON解析框架性能比较
原文链接http://palmsky.net/?p=3227
下图是从ArthurChenJS的博客文章中截取的一张benchmark测试结果图(横条越短,解析速度越快):
1.那么应该换成哪个呢? 如果你的app只支持iOS 5.0以上系统,那么直接用苹果官方提供的JSON库:NSJSONSerialization 库即可。
实例(以解析信阳市天气为例):
NSError *error;
// 加载一个NSURL对象
"http://m.weather.com.cn/data/101180601.html"]];
// 将请求的url数据放到NSData对象中
// iOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
// weatherDic字典中存放的数据也是字典型,从它里面通过键值取值
"weatherinfo"];
"今天是 %@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);
// 打印出weatherInfo字典所存储数据
"weatherInfo字典里面的内容是--->%@",[weatherInfo description]);
2.如果你的app要支持iOS 5.0以下的系统,那么我个人推荐JSONKit,不过JSONKit本身做了很多内存上的优化,所以
不支持ARC,你在使用时可以对其加上 -fno-objc-arc 的编译标志即可,设置这个编译标志的详细步骤可以见 这篇文章。JSONKit的使用也非常方便,在使用上只需要把SBJSON的JSONValue方法换成objectFromJSONData,JSONRepresentation方法换成JSONString即可。
示例:
#import “JSONKit.h”
NSString*path=[[NSBundle mainBundle] pathForResource:@”data” ofType:@”json”];
NSData*content=[NSData dataWithContentsOfFile:path];
NSDictionary*kitData=[content objectFromJSONData];
NSString*kitString=[kitData JSONString];
3.显而易见,TouchJSON一直是最慢的
示例(以解析北京市天气为例):
//获取API接口
"http://m.weather.com.cn/data/101010100.html"];
// 定义一个NSError对象,用于捕获错误信息
NSError *error;
// NSLog(@"jsonstring--->%@",jsonString);
// 将解析得到的内容存放字典中,编码格式UTF8,防止取值时候发生乱码
NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:&error];
// 因为返回的Json文件有两层,取第二层内容放到字典中去
"weatherinfo"];
// 取值打印
"今天是 %@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);
4.看来SBJSON一直屈居倒数第二,大众们准备放弃吧
示例(以解析南阳天气为例);
"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];
"weatherinfo"];
"今天是 %@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);
二、各种框架下载地址
-[NSJSONSerialization](http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40010946)
- [NextiveJson](https://github.com/nextive/NextiveJson)
- [JSONKit](https://github.com/johnezang/JSONKit)
- [TouchJSON (from touchcode)](http://code.google.com/p/touchcode/)
- [YAJL (objective-C bindings)](
http://github.com/gabriel/yajl-objc)
- [SBJSON (json-framework)](
http://code.google.com/p/json-framework/)
三、第一模块中各种解析速率统计
原文链接
我们选择了四个包含json格式的数据的文件进行测试。每一个文件进行100的解析动作,对解析的时间进行比较。
工程包含以下的文件和框架:
测试时间间隔的的代码的宏定义如下,其中计算的次数和解析的代码由外部调用传入:
#define RunWithCount(count, description, expr) \
do { \
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); \
for(NSInteger i = 0; i < count; i++) { \
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; \
expr; \
[pool release]; \
} \
\
CFTimeInterval took = CFAbsoluteTimeGetCurrent() - start; \
NSLog(@"%@ %0.3f", description, took); \
\
} while (0)
这是外面调用的代码,设置读取的json文件和计算的次数,每一个函数在进行对应框架API的解析代码:
JSONTest *test = [[JSONTest alloc] init];
NSInteger count = 100;
[test runWithResourceName:@"twitter_public.json" count:count];
[test runWithResourceName:@"lastfm.json" count:count];
[test runWithResourceName:@"delicious_popular.json" count:count];
[test runWithResourceName:@"yelp.json" count:count];
我们的测试的环境是Xcode 4.2和iOS5,计算次数是100次,这是计算的结果Log:
2011-11-24 14:48:59.441 JSONPerfTest[9716:207] SBJSON-twitter_public.json 0.335
2011-11-24 14:48:59.625 JSONPerfTest[9716:207] YAJL-twitter_public.json 0.183
2011-11-24 14:49:00.095 JSONPerfTest[9716:207] TouchJSON-twitter_public.json 0.469
2011-11-24 14:49:00.226 JSONPerfTest[9716:207] JSONKit-twitter_public.json 0.130
2011-11-24 14:49:00.390 JSONPerfTest[9716:207] NextiveJson-twitter_public.json 0.164
2011-11-24 14:49:00.504 JSONPerfTest[9716:207] NSJSONSerialization-twitter_public.json 0.113
2011-11-24 14:49:01.196 JSONPerfTest[9716:207] SBJSON-lastfm.json 0.691
2011-11-24 14:49:01.516 JSONPerfTest[9716:207] YAJL-lastfm.json 0.320
2011-11-24 14:49:02.367 JSONPerfTest[9716:207] TouchJSON-lastfm.json 0.850
2011-11-24 14:49:02.580 JSONPerfTest[9716:207] JSONKit-lastfm.json 0.212
2011-11-24 14:49:02.861 JSONPerfTest[9716:207] NextiveJson-lastfm.json 0.280
2011-11-24 14:49:03.039 JSONPerfTest[9716:207] NSJSONSerialization-lastfm.json 0.177
2011-11-24 14:49:03.546 JSONPerfTest[9716:207] SBJSON-delicious_popular.json 0.506
2011-11-24 14:49:03.787 JSONPerfTest[9716:207] YAJL-delicious_popular.json 0.240
2011-11-24 14:49:04.460 JSONPerfTest[9716:207] TouchJSON-delicious_popular.json 0.672
2011-11-24 14:49:04.668 JSONPerfTest[9716:207] JSONKit-delicious_popular.json 0.207
2011-11-24 14:49:04.904 JSONPerfTest[9716:207] NextiveJson-delicious_popular.json 0.234
2011-11-24 14:49:05.072 JSONPerfTest[9716:207] NSJSONSerialization-delicious_popular.json 0.168
2011-11-24 14:49:05.434 JSONPerfTest[9716:207] SBJSON-yelp.json 0.361
2011-11-24 14:49:05.633 JSONPerfTest[9716:207] YAJL-yelp.json 0.198
2011-11-24 14:49:06.154 JSONPerfTest[9716:207] TouchJSON-yelp.json 0.519
2011-11-24 14:49:06.310 JSONPerfTest[9716:207] JSONKit-yelp.json 0.155
2011-11-24 14:49:06.497 JSONPerfTest[9716:207] NextiveJson-yelp.json 0.186
2011-11-24 14:49:06.637 JSONPerfTest[9716:207] NSJSONSerialization-yelp.json 0.140