`
java-mans
  • 浏览: 11725309 次
文章分类
社区版块
存档分类
最新评论

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需要下载他们的库

TouchJsonhttp://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库解背景天气

  1. -(IBAction)buttonPressedone:(id)sender{
  2. //获取API接口
  3. NSURL*url=[NSURLURLWithString:@"http://m.weather.com.cn/data/101010100.html"];
  4. //定义一个NSError对象,用于捕获错误信息
  5. NSError*error;
  6. //
  7. NSString*jsonString=[NSStringstringWithContentsOfURL:urlencoding:NSUTF8StringEncodingerror:&error];
  8. //NSLog(@"jsonstring--->%@",jsonString);
  9. //将解析得到的内容存放字典中,编码格式UTF8,防止取值时候发生乱码
  10. NSDictionary*rootDic=[[CJSONDeserializerdeserializer]deserialize:[jsonStringdataUsingEncoding:NSUTF8StringEncoding]error:&error];
  11. //因为返回的Json文件有两层,去第二层类容放到字典中去0
  12. NSDictionary*weatherInfo=[rootDicobjectForKey:@"weatherinfo"];
  13. //取值打印
  14. NSLog(@"今天是%@%@%@的天气状况是:%@%@",[weatherInfoobjectForKey:@"date_y"],[weatherInfoobjectForKey:@"week"],[weatherInfoobjectForKey:@"city"],[weatherInfoobjectForKey:@"weather1"],[weatherInfoobjectForKey:@"temp1"]);
  15. }


SBJson库,解析南阳天气,换一下城市的id号就可以了

  1. -(IBAction)buttonPressedtwo:(id)sender{
  2. NSURL*url=[NSURLURLWithString:@"http://m.weather.com.cn/data/101180701.html"];
  3. NSError*error=nil;
  4. NSString*jsonString=[NSStringstringWithContentsOfURL:urlencoding:NSUTF8StringEncodingerror:&error];
  5. SBJsonParser*parser=[[SBJsonParseralloc]init];
  6. NSDictionary*rootDic=[parserobjectWithString:jsonStringerror:&error];
  7. NSDictionary*weatherInfo=[rootDicobjectForKey:@"weatherinfo"];
  8. NSLog(@"今天是%@%@%@的天气状况是:%@%@",[weatherInfoobjectForKey:@"date_y"],[weatherInfoobjectForKey:@"week"],[weatherInfoobjectForKey:@"city"],[weatherInfoobjectForKey:@"weather1"],[weatherInfoobjectForKey:@"temp1"]);
  9. }


iOS5所支持的原生json解析,信阳市天气
  1. -(IBAction)buttonPressedthree:(id)sender{
  2. NSError*error;
  3. //加载一个NSURL对象
  4. NSURLRequest*request=[NSURLRequestrequestWithURL:[NSURLURLWithString:@"http://m.weather.com.cn/data/101180601.html"]];
  5. //将请求的url数据放到NSData对象中
  6. NSData*response=[NSURLConnectionsendSynchronousRequest:requestreturningResponse:nilerror:nil];
  7. //iOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
  8. NSDictionary*weatherDic=[NSJSONSerializationJSONObjectWithData:responseoptions:NSJSONReadingMutableLeaveserror:&error];
  9. //weatherDic字典中存放的数据也是字典型,从它里面通过键值取值
  10. NSDictionary*weatherInfo=[weatherDicobjectForKey:@"weatherinfo"];
  11. NSLog(@"今天是%@%@%@的天气状况是:%@%@",[weatherInfoobjectForKey:@"date_y"],[weatherInfoobjectForKey:@"week"],[weatherInfoobjectForKey:@"city"],[weatherInfoobjectForKey:@"weather1"],[weatherInfoobjectForKey:@"temp1"]);
  12. //打印出weatherInfo字典所存储数据
  13. NSLog(@"weatherInfo字典里面的内容是--->%@",[weatherInfodescription]);
  14. }

如果我们像获取更多信息,直接从字典中取值

我们用到了这样一个类方法

+ (NSData*)sendSynchronousRequest:(NSURLRequest*)requestreturningResponse:(NSURLResponse**)responseerror:(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*dicinweatherArray) {

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

}

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


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

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


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


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


分享到:
评论

相关推荐

    IOS之JSON数据解析

    本文将深入探讨如何在iOS中解析JSON数据,以“IOS之JSON数据解析”为主题,结合标签“源码”和“工具”,我们将讨论如何使用SBJson框架进行JSON的解析。 首先,JSON是一种轻量级的、易于人阅读和编写的数据格式,...

    iOS xml解析和json解析demo

    总结一下,这个"iOS xml解析和json解析demo"将涵盖如何在iOS应用中解析XML数据,包括使用NSXMLParser和XMLParser,以及如何解析和序列化JSON数据,包括使用内置的JSONSerialization类和可能涉及的一些第三方库。...

    IOS学习之四种Json解析方法的分析demo

    这四种解析方式各有优劣,SBJson和JSONKit在性能上可能更胜一筹,而系统内置的`JSONSerialization`则具有更好的兼容性和易用性。开发者可以根据项目的具体需求和目标平台选择合适的解析库。 在分析JSON解析方法时,...

    iOS下json解析工具

    iOS下解析json数据,自己亲自使用过,挺好用的。 使用JSONKit的解析方法:(需导入包:#import "JSONKit/JSONKit.h") - (void)printJson{ //如果json是“单层”的,即value都是字符串、数字,可以使用...

    ios开发-json数据解析框架

    在iOS开发中,JSON(JavaScript Object Notation)数据解析是一个重要的环节,因为它是一种轻量级的数据交换格式,广泛用于Web服务和移动应用之间的数据传输。本文将深入探讨JSON在iOS开发中的作用,以及如何利用...

    IOS json解析

    在iOS开发中,JSON(JavaScript Object Notation)是一种常见的数据交换格式,被广泛用于网络通信,将服务器端的数据传输到客户端。"IOS json解析"这个主题涵盖了如何在iOS应用中处理JSON数据,尤其是利用苹果内置的...

    ios下三种解析json的库 sbjson TouchJson JSONKit

    本篇文章将详细介绍三种在iOS开发中常用的JSON解析库:SBJSON、TouchJSON以及JSONKit。 1. **SBJSON** SBJSON是Stig Brautaset开发的一个开源库,它提供了一个简单的方法来解析和生成JSON数据。SBJSON不仅支持...

    iOS5系统API和5个开源库的JSON解析速度测试

    iOS 5系统引入了一个新的API,即`NSJSONSerialization`,来支持JSON的解析和序列化。这次测试的目的是对比`NSJSONSerialization`与其他五种开源JSON解析库在iOS 5上的性能表现。 测试所涉及的五个开源JSON解析库...

    ios下解析json的demo

    在iOS开发中,JSON(JavaScript Object Notation)是一种常见的数据交换格式,被广泛用于服务器与客户端之间的通信。本文将深入探讨如何在iOS环境下利用官方工具包解析JSON数据,以供开发者参考。 首先,我们需要...

    浅谈ios中的json解析(转载)

    本文将深入探讨iOS中如何进行JSON解析,包括基本概念、解析方法以及实际应用示例。 首先,JSON是一种轻量级的文本格式,它基于ECMAScript的一个子集,易于人阅读和编写,同时也易于机器解析和生成。JSON数据通常...

    IOS抓包工具和JSON解析工具

    Moya提供了一种声明式的方式来定义API接口,同时集成了JSON解析,使网络请求变得更加优雅和可测试。 总的来说,对于iOS开发者来说,掌握如何使用抓包工具如Charles和Wireshark,以及理解如何解析JSON数据(如使用...

    ios下json数据解析的TouchJson的库

    在iOS开发中,JSON(JavaScript Object Notation)是一种常见的数据交换格式,被广泛用于服务器与客户端之间的通信。JSON因其简洁、易读、易解析的特性,成为移动应用开发者首选的数据格式。本文将深入探讨在iOS环境...

    iOS开发使用JSON解析网络数据

    它的结构类似于Objective-C中的字典和数组,使得在iOS应用中解析和生成JSON数据变得相对简单。 JSON的基本数据类型包括字符串(string)、数字(number)、布尔值(boolean)、数组(array)、对象(object)和null...

    ios下json数据解析的实例

    在iOS开发中,JSON(JavaScript Object Notation)是一种常见的数据交换格式,被广泛用于服务器与客户端之间的通信。本文将深入探讨在iOS环境下如何解析JSON数据,以“ios下json数据解析的实例”为主题,结合提供的...

    IOS XML转JSON数据

    - 或者,可以使用第三方库如SWXMLHash,它提供了一个更友好的API来解析XML并将其转化为字典或数组。 3. **将字典转换为JSON** - 使用`NSJSONSerialization`的`dataWithJSONObject:options:error:`方法,将字典...

    ios下json数据解析的SBJson 库

    在iOS开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。当涉及到iOS应用与服务器之间的数据交互时,JSON解析库就显得尤为重要。...

    ios下json数据解析的JsonKit库

    在iOS开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛用于应用程序与服务器之间的数据传输。为了在Objective-C中处理JSON数据,开发者通常会使用各种库,其中JsonKit是一个流行的...

    IOS json解析成Model

    总的来说,将JSON解析成Model对象是iOS开发中的常见操作,通过使用如`LLJsonModel`这样的第三方库或内置的`JSONSerialization`类(Objective-C/Swift),可以方便地实现这个功能。这不仅简化了代码,也使得数据处理...

    iOS_JSON_解析

    本篇将详细介绍在iOS中解析JSON数据的六种方法,这些方法都是可以直接运行的。 1. **NSJSONSerialization**: iOS内置了`NSJSONSerialization`类,它提供了方便的方法来解析和序列化JSON数据。要解析JSON,可以...

Global site tag (gtag.js) - Google Analytics