iOS三種Json方法解析國家氣象局API

來源:互聯網
上載者:User

國家氣象局提供的天氣預報介面

介面地址有三個:

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.