作为一种轻量级的数据交换格式,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