一、各种iOS JSON解析框架性能比较
原文链接http://palmsky.net/?p=3227
下图是从ArthurChenJS的博客文章中截取的一张benchmark测试结果图(横条越短,解析速度越快):
1.那么应该换成哪个呢? 如果你的app只支持iOS 5.0以上系统,那么直接用苹果官方提供的JSON库:NSJSONSerialization 库即可。
实例(以解析信阳市天气为例):
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];
// weatherDic字典中存放的数据也是字典型,从它里面通过键值取值
NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"];
NSLog(@"今天是 %@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);
// 打印出weatherInfo字典所存储数据
NSLog(@"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接口
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 objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);
4.看来SBJSON一直屈居倒数第二,大众们准备放弃吧
示例(以解析南阳天气为例);
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"];
NSLog(@"今天是 %@ %@ %@ 的天气状况是:%@ %@",[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/ )