iOS三种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好我们就可以解析出来各个城市对应天气;


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库解析北京天气

- (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号就可以了

- (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解析,信阳市天气
- (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 = [rootDicobjectForKey:@"weatherinfo"];

    NSArray *weatherArray = [rootDicobjectForKey:@"weatherinfo"];

    for (NSDictionary *dicin weatherArray) {

        NSLog(@"----->%@",dic);

    }

打印出来的dic数据是这样的


这是我们json文件的第二层数据取出放到了一个数组中,然后定义了一个字典对象在数组中遍历取出存放的数据,于是就想用

NSLog(@"----->%@",[dicobjectForKey:@"city"]);来取出city的值,但是应用程序崩溃


出现这种情况是因为在对解析出数据存值和取值发生问题,说明这种方式是取值是不正确的;


源代码:http://download.csdn.net/detail/duxinfeng2010/4484818



     本文转自新风作浪 51CTO博客,原文链接:http://blog.51cto.com/duxinfeng/1208785,如需转载请自行联系原作者




相关文章
|
1天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
8 0
|
11天前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。
|
15天前
|
Java API PHP
邮件发送API的方法和步骤
邮件发送API能便捷地自动化发送邮件,提高效率。步骤包括:1. 选择如aoksend、Mailgun或Amazon SES等适合的API;2. 注册并获取API密钥;3. 设置发件人、收件人、主题和内容等参数;4. 根据API文档用Python等语言编写调用代码;5. 调用API发送邮件并处理结果;6. 根据返回信息判断发送是否成功。适用于大量邮件发送场景。
|
15天前
|
API 开发者
邮件API接口使用的方法和步骤
AOKSEND指南:了解和使用邮件API接口,包括选择适合的接口(如AOKSEND、Mailgun、SMTP),获取访问权限,配置发件人、收件人及邮件内容,调用接口发送邮件,并处理返回结果,以高效集成邮件功能。
|
16天前
|
API
邮箱API发送邮件调试的方法和步骤
AokSend指南:调试邮箱API发送邮件涉及确认调试目的、检查参数设置、接口调用、异常处理、日志记录及结果验证。确保参数正确,关注接口返回,记录日志以分析问题,处理异常情况,最终验证邮件发送成功与内容准确性。AokSend提供高效发信服务,支持SMTP/API接口,适用于大量验证码发送。
|
16天前
|
API 开发者
免费邮箱API发送邮件测试调试的方法和步骤
本文介绍了使用免费邮箱API如aoksend、Mailgun、SMTP2GO发送邮件的测试调试步骤:选择合适的API,获取访问密钥,配置邮件参数,编写测试代码,调试和测试,查看发送日志,以及优化改进邮件发送功能,确保其稳定运行。
|
17天前
|
API PHP 数据安全/隐私保护
IMAP邮箱API接收收取邮件的方法和步骤
IMAP邮箱API是用于自动接收和管理邮件的接口,允许程序无须手动登录即可操作邮件。要使用它,需先配置邮箱允许API访问,选择如Python的imaplib或PHP的imap扩展等IMAP库,然后连接到邮箱服务器,接收和处理邮件。处理完毕后断开连接。AokSend提供高效发信服务,支持SMTP/API接口。使用IMAP API能提升邮件管理效率。
|
17天前
|
API 网络安全 数据安全/隐私保护
SMTP邮件邮箱API发送邮件的方法和步骤
使用SMTP邮件邮箱API(如AokSend)发送邮件涉及6个步骤:获取SMTP服务器地址和端口,进行身份验证,构建邮件内容,连接到服务器,发送邮件及处理结果。例如,Gmail的SMTP服务器地址是smtp.gmail.com,端口587。此方法适用于程序化发送邮件,确保安全并支持大规模发信服务。
|
18天前
|
API Python
Relay邮件邮箱API发送邮件的方法和步骤
Relay邮件邮箱API是编程发送邮件的工具,允许用户通过代码实现邮件发送。发送步骤包括:获取API密钥、设置发件人和收件人信息、编写邮件内容,最后调用API发送。Python示例代码展示了如何使用API发送邮件,需替换API密钥和邮箱地址。
|
18天前
|
监控 API 开发工具
邮件中继中转邮箱API发送邮件的方法和步骤
AokSend介绍了使用邮件中继中转邮箱API发送邮件的步骤:理解API概念,获取API密钥,设置发件人和收件人信息,构建并发送API请求,处理响应,监控调试,及完善邮件功能。该服务支持大量验证码发送、触发式接口和高触达SMTP/API接口。选择合适提供商并参考文档可优化邮件发送。