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