JSON 数据的4中解析方式比较

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式。

有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接)。此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便。
从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的ios版本,可以使用第三方库来解析Json。
本文将介绍TouchJSON、 SBJson 、JSONKit 和 iOS5所支持的原生的json方法,解析国家气象局API。

国家气象局提供的天气预报接口
接口地址有三个:
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
第三接口信息较为详细,提供的是6天的天气,关于API所返回的信息请见开源免费天气预报接口API以及全国所有地区代码!!(国家气象局提供),全国各城市对应这一个id号,根据改变id好我们就可以解析出来各个城市对应天气;

使用Cocoapods 将TouchJSON、 SBJson 、JSONKit 第三方的框架加入到项目中:


 

相关代码如下: 

#import "ViewController.h"
#import <SBJson/SBJson.h>
#import <TouchJSON/CJSONDeserializer.h>
#import <JSONKit/JSONKit.h>

@interface ViewController ()

@end

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

//TouchJSON解析json,性能最差
- (IBAction)touchJSON:(id)sender {
    //天气预报的url
    NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"];
    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"];    self.weatherMessage.text = [NSString stringWithFormat:@"今天是%@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]];

     }

   * //SBJson解析json,性能倒二
- (IBAction)SBJson:(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];
    NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];

     self.weatherMessage.text = [NSString stringWithFormat:@"今天是%@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]];

}

//JSONKit解析json,性能第二,与iosJSON相当
- (IBAction)JSONKit:(id)sender {
    NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101180801.html"];
    NSError *error = nil;
    NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    JSONDecoder *decoder = [[JSONDecoder alloc] initWithParseOptions:JKSerializeOptionNone];
    id result = [decoder objectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
    if ([result isKindOfClass:[NSDictionary class]]) {
        NSDictionary *rootDic = (NSDictionary *)result;
        NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];

        self.weatherMessage.text = [NSString stringWithFormat:@"今天是%@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]];

    }
}

//ios5 自带的JSON器解析json,性能最优
- (IBAction)iosJSON:(id)sender {
    NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101180601.html"];
    NSError *error = nil;
    NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

    id result = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:&error];
    if ([result isKindOfClass:[NSDictionary class]]) {
        NSDictionary *rootDic = (NSDictionary *)result;
        NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];

        self.weatherMessage.text = [NSString stringWithFormat:@"今天是%@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]];
    }
}

@end

 

猜你喜欢

转载自cht005288201307234627.iteye.com/blog/1927952