天天看点

iOS json解析

一、各种iOS JSON解析框架性能比较

原文链接http://palmsky.net/?p=3227

下图是从ArthurChenJS的博客文章中截取的一张benchmark测试结果图(横条越短,解析速度越快):

iOS json解析

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/ )