iOS三种Json方法解析国家气象局API
2012-09-03 23:43
337 查看
国家气象局提供的天气预报接口
接口地址有三个:
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好我们就可以解析出来各个城市对应天气;
Json以其轻巧简单成为较为流行文件格式,在手机上传输比XML快,iOS5以前苹果公司并没有对Json解析提供库文件支持,但是好在有一些大牛们专门为Objective-c只做了能够解析Json文件的库,iOS苹果公司提供了对json的原生支持类NSJSONSerialization;本文将介绍TouchJson
SBJson 和iOS5所支持的原生的json方法,解析国家气象局API,TouchJson和SBJson需要下载他们的库
TouchJson http://download.csdn.net/detail/duxinfeng2010/4484144
SBJson http://download.csdn.net/detail/duxinfeng2010/4484842
1.创建一个新工程叫JsonThreeDemo; File->New->Project ->single View Application -> next,注意不使用ARC,不要勾选Use Automatic Refrence Counting,否则运行时候库文件中会报错
2.使用TouchJson库需要添加头文件 #import "CJSONDeserializer.h",使用SBJson需要添加头文件 #import "SBJson.h"然后打开XIB添加三个button,让添加三个方法
- (IBAction)buttonPressedone:(id)sender;
- (IBAction)buttonPressedtwo:(id)sender;
- (IBAction)buttonPressedthree:(id)sender;
3.三个解析方法都类似
TouchJson库解背景天气
[cpp] view
plaincopy
- (IBAction)buttonPressedone:(id)sender {
// 获取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文件有两层,去第二层类容放到字典中去0
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
// 取值打印
NSLog(@"今天是 %@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);
}
SBJson库,解析南阳天气,换一下城市的id号就可以了
[cpp] view
plaincopy
- (IBAction)buttonPressedtwo:(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 error:&error];
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
NSLog(@"今天是 %@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);
}
iOS5所支持的原生json解析,信阳市天气
[cpp] view
plaincopy
- (IBAction)buttonPressedthree:(id)sender {
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]);
}
如果我们像获取更多信息,直接从字典中取值
我们用到了这样一个类方法
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
request 要装载的URL请求. 这个request 对象 作为初始化进程的一部分,被深度复制(deep-copied). 在这个方法返回之后, 再修改request, 将不会影响用在装载的过程中的request
reponse 输出参数, 由服务器返回的URL响应
error 输出参数, 如果在处理请求的过程中发生错误,就会使用. 无错误,就为NULL
它返回的是一个下载的url请求,如果连接失败或者创建失败失败返回nil
4.运行结果(如果想知道每次字符串和字典间取值情况,只需NSLog打印输出就行):
5.再解析取值的时候花费了一些时间,取值时发生应用程序崩溃,获取值不正确
有时我们从字典中获取了这样的数据,感觉比较郁闷,并未显示中文,这种情况是我们把数据放到字典中,编码方式是UTF8,取值打印出来的时候就成中文了
在解析出来数据后我想这样取值,
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
NSArray *weatherArray = [rootDic objectForKey:@"weatherinfo"];
for (NSDictionary *dicin weatherArray) {
NSLog(@"----->%@",dic);
}
打印出来的dic数据是这样的
这是我们json文件的第二层数据取出放到了一个数组中,然后定义了一个字典对象在数组中遍历取出存放的数据,于是就想用
NSLog(@"----->%@",[dicobjectForKey:@"city"]);来取出city的值,但是应用程序崩溃
出现这种情况是因为在对解析出数据存值和取值发生问题,说明这种方式是取值是不正确的;
源代码:http://download.csdn.net/detail/duxinfeng2010/4484818
接口地址有三个:
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好我们就可以解析出来各个城市对应天气;
Json以其轻巧简单成为较为流行文件格式,在手机上传输比XML快,iOS5以前苹果公司并没有对Json解析提供库文件支持,但是好在有一些大牛们专门为Objective-c只做了能够解析Json文件的库,iOS苹果公司提供了对json的原生支持类NSJSONSerialization;本文将介绍TouchJson
SBJson 和iOS5所支持的原生的json方法,解析国家气象局API,TouchJson和SBJson需要下载他们的库
TouchJson http://download.csdn.net/detail/duxinfeng2010/4484144
SBJson http://download.csdn.net/detail/duxinfeng2010/4484842
1.创建一个新工程叫JsonThreeDemo; File->New->Project ->single View Application -> next,注意不使用ARC,不要勾选Use Automatic Refrence Counting,否则运行时候库文件中会报错
2.使用TouchJson库需要添加头文件 #import "CJSONDeserializer.h",使用SBJson需要添加头文件 #import "SBJson.h"然后打开XIB添加三个button,让添加三个方法
- (IBAction)buttonPressedone:(id)sender;
- (IBAction)buttonPressedtwo:(id)sender;
- (IBAction)buttonPressedthree:(id)sender;
3.三个解析方法都类似
TouchJson库解背景天气
[cpp] view
plaincopy
- (IBAction)buttonPressedone:(id)sender {
// 获取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文件有两层,去第二层类容放到字典中去0
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
// 取值打印
NSLog(@"今天是 %@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);
}
SBJson库,解析南阳天气,换一下城市的id号就可以了
[cpp] view
plaincopy
- (IBAction)buttonPressedtwo:(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 error:&error];
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
NSLog(@"今天是 %@ %@ %@ 的天气状况是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);
}
iOS5所支持的原生json解析,信阳市天气
[cpp] view
plaincopy
- (IBAction)buttonPressedthree:(id)sender {
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]);
}
如果我们像获取更多信息,直接从字典中取值
我们用到了这样一个类方法
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
request 要装载的URL请求. 这个request 对象 作为初始化进程的一部分,被深度复制(deep-copied). 在这个方法返回之后, 再修改request, 将不会影响用在装载的过程中的request
reponse 输出参数, 由服务器返回的URL响应
error 输出参数, 如果在处理请求的过程中发生错误,就会使用. 无错误,就为NULL
它返回的是一个下载的url请求,如果连接失败或者创建失败失败返回nil
4.运行结果(如果想知道每次字符串和字典间取值情况,只需NSLog打印输出就行):
5.再解析取值的时候花费了一些时间,取值时发生应用程序崩溃,获取值不正确
有时我们从字典中获取了这样的数据,感觉比较郁闷,并未显示中文,这种情况是我们把数据放到字典中,编码方式是UTF8,取值打印出来的时候就成中文了
在解析出来数据后我想这样取值,
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
NSArray *weatherArray = [rootDic objectForKey:@"weatherinfo"];
for (NSDictionary *dicin weatherArray) {
NSLog(@"----->%@",dic);
}
打印出来的dic数据是这样的
这是我们json文件的第二层数据取出放到了一个数组中,然后定义了一个字典对象在数组中遍历取出存放的数据,于是就想用
NSLog(@"----->%@",[dicobjectForKey:@"city"]);来取出city的值,但是应用程序崩溃
出现这种情况是因为在对解析出数据存值和取值发生问题,说明这种方式是取值是不正确的;
源代码:http://download.csdn.net/detail/duxinfeng2010/4484818
相关文章推荐
- iOS三种Json方法解析国家气象局API
- iOS三种Json方法解析国家气象局API
- iOS三种Json方法解析国家气象局API
- IOS中Json解析的四种方法
- IOS中Json解析的四种方法
- iOS中Json解析的四种方法
- IOS学习之四种Json解析方法的分析,含有demo
- IOS中Json解析的四种方法
- IOS中Json解析的四种方法
- iOS中解析json格式数据的各种方法调用
- IOS中Json解析的四种方法
- iOS解析json的4种方法
- IOS中Json解析的四种方法
- JSON三种数据解析方法
- IOS中Json解析的四种方法
- IOS中Json解析的四种方法
- IOS中Json解析的四种方法
- IOS JSON的四种解析方法(转)
- IOS中Json解析的四种方法
- ios json解析 碰到有转义字符的解决方法