iOS三種Json方法解析國(guó)家氣象局API

國(guó)家氣象局提供的天氣預(yù)報(bào)接口

10余年的來賓網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整來賓建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“來賓網(wǎng)站設(shè)計(jì)”,“來賓網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

接口地址有三個(gè):

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

第三接口信息較為詳細(xì),提供的是6天的天氣,關(guān)于API所返回的信息請(qǐng)見開源免費(fèi)天氣預(yù)報(bào)接口API以及全國(guó)所有地區(qū)代碼?。。▏?guó)家氣象局提供),全國(guó)各城市對(duì)應(yīng)這一個(gè)id號(hào),根據(jù)改變id好我們就可以解析出來各個(gè)城市對(duì)應(yīng)天氣;


Json以其輕巧簡(jiǎn)單成為較為流行文件格式,在手機(jī)上傳輸比XML快,iOS5以前蘋果公司并沒有對(duì)Json解析提供庫(kù)文件支持,但是好在有一些大牛們專門為Objective-c只做了能夠解析Json文件的庫(kù),iOS蘋果公司提供了對(duì)json的原生支持類NSJSONSerialization;本文將介紹TouchJson SBJson 和iOS5所支持的原生的json方法,解析國(guó)家氣象局API,TouchJson和SBJson需要下載他們的庫(kù) 

TouchJson  http://download.csdn.net/detail/duxinfeng2010/4484144

SBJson     http://download.csdn.net/detail/duxinfeng2010/4484842


1.創(chuàng)建一個(gè)新工程叫JsonThreeDemo; File->New->Project ->single View Application -> next,注意不使用ARC,不要勾選Use Automatic Refrence Counting,否則運(yùn)行時(shí)候庫(kù)文件中會(huì)報(bào)錯(cuò)

iOS三種Json方法解析國(guó)家氣象局API


2.使用TouchJson庫(kù)需要添加頭文件 #import "CJSONDeserializer.h",使用SBJson需要添加頭文件 #import "SBJson.h"然后打開XIB添加三個(gè)button,讓添加三個(gè)方法

iOS三種Json方法解析國(guó)家氣象局API

- (IBAction)buttonPressedone:(id)sender;

- (IBAction)buttonPressedtwo:(id)sender;

- (IBAction)buttonPressedthree:(id)sender;


3.三個(gè)解析方法都類似

TouchJson庫(kù)解析北京天氣

- (IBAction)buttonPressedone:(id)sender { //    獲取API接口     NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"]; //    定義一個(gè)NSError對(duì)象,用于捕獲錯(cuò)誤信息     NSError *error; //         NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];     //    NSLog(@"jsonstring--->%@",jsonString); //    將解析得到的內(nèi)容存放字典中,編碼格式UTF8,防止取值時(shí)候發(fā)生亂碼     NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:&error]; //    因?yàn)榉祷氐腏son文件有兩層,去第二層類容放到字典中去0     NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"]; //    取值打印     NSLog(@"今天是 %@ %@ %@ 的天氣狀況是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]);  }


SBJson庫(kù),解析南陽(yáng)天氣,換一下城市的id號(hào)就可以了

- (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解析,信陽(yáng)市天氣
- (IBAction)buttonPressedthree:(id)sender {     NSError *error; //    加載一個(gè)NSURL對(duì)象     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.weather.com.cn/data/101180601.html"]]; //    將請(qǐng)求的url數(shù)據(jù)放到NSData對(duì)象中     NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; //    iOS5自帶解析類NSJSONSerialization從response中解析出數(shù)據(jù)放到字典中     NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error]; //    weatherDic字典中存放的數(shù)據(jù)也是字典型,從它里面通過鍵值取值     NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"];          NSLog(@"今天是 %@ %@ %@ 的天氣狀況是:%@ %@",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]); //    打印出weatherInfo字典所存儲(chǔ)數(shù)據(jù)     NSLog(@"weatherInfo字典里面的內(nèi)容是--->%@",[weatherInfo description]); }

如果我們像獲取更多信息,直接從字典中取值

我們用到了這樣一個(gè)類方法

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error

  • request 要裝載的URL請(qǐng)求. 這個(gè)request 對(duì)象 作為初始化進(jìn)程的一部分,被深度復(fù)制(deep-copied). 在這個(gè)方法返回之后, 再修改request, 將不會(huì)影響用在裝載的過程中的request
  • reponse 輸出參數(shù), 由服務(wù)器返回的URL響應(yīng)
  • error   輸出參數(shù), 如果在處理請(qǐng)求的過程中發(fā)生錯(cuò)誤,就會(huì)使用.  無錯(cuò)誤,就為NULL
它返回的是一個(gè)下載的url請(qǐng)求,如果連接失敗或者創(chuàng)建失敗失敗返回nil


4.運(yùn)行結(jié)果(如果想知道每次字符串和字典間取值情況,只需NSLog打印輸出就行):

iOS三種Json方法解析國(guó)家氣象局API


5.再解析取值的時(shí)候花費(fèi)了一些時(shí)間,取值時(shí)發(fā)生應(yīng)用程序崩潰,獲取值不正確

有時(shí)我們從字典中獲取了這樣的數(shù)據(jù),感覺比較郁悶,并未顯示中文,這種情況是我們把數(shù)據(jù)放到字典中,編碼方式是UTF8,取值打印出來的時(shí)候就成中文了

iOS三種Json方法解析國(guó)家氣象局API


在解析出來數(shù)據(jù)后我想這樣取值,

NSDictionary *weatherInfo = [rootDicobjectForKey:@"weatherinfo"];

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

    for (NSDictionary *dicin weatherArray) {

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

    }

打印出來的dic數(shù)據(jù)是這樣的

iOS三種Json方法解析國(guó)家氣象局API

這是我們json文件的第二層數(shù)據(jù)取出放到了一個(gè)數(shù)組中,然后定義了一個(gè)字典對(duì)象在數(shù)組中遍歷取出存放的數(shù)據(jù),于是就想用

NSLog(@"----->%@",[dicobjectForKey:@"city"]);來取出city的值,但是應(yīng)用程序崩潰

iOS三種Json方法解析國(guó)家氣象局API

出現(xiàn)這種情況是因?yàn)樵趯?duì)解析出數(shù)據(jù)存值和取值發(fā)生問題,說明這種方式是取值是不正確的;


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



分享名稱:iOS三種Json方法解析國(guó)家氣象局API
標(biāo)題鏈接:http://bm7419.com/article26/pceocg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站云服務(wù)器、App設(shè)計(jì)、用戶體驗(yàn)外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名