一、各种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