Objective-C  OpenWeatherMap:天気情報の取得

OpenWeatherMapの天気情報を使用したiPhoneアプリを制作したくWeb-APIを使ってJSON形式でデータを取得したい!」を参考にしJSONデータのパース方法をまとめました。

OpenWeatherMap公式ページ

取得結果(JSON形式)


WeatherSBJson[1232:632645] JSON dictionary={

    base = stations;

    clouds =     {

        all = 0;

    };

    cod = 200;

    coord =     {

        lat = "34.65";

        lon = "135.52";

    };

    dt = 1429749102;

    id = 7303469;

    main =     {

        "grnd_level" = "1014.6";

        humidity = 79;

        pressure = "1014.6";

        "sea_level" = "1035.98";

        temp = "288.3";

        "temp_max" = "288.3";

        "temp_min" = "288.3";

    };

    name = "Osaka-Wan";

    sys =     {

        country = Japan;

        message = "0.036";

        sunrise = 1429733793;

        sunset = 1429781759;

    };

    weather =     (

                {

            description = "Sky is Clear";

            icon = 01d;

            id = 800;

            main = Clear;

        }

    );

    wind =     {

        deg = 239;

        speed = "1.21";

    };

}


Main.storyboardのUIを作成する前にダウンロードした SBJson ファイルを展開しXcode のプロジェクトに加えます。

Stig Brautaset氏がGitHubに

オープンソースを公開している(https://github.com/stig/json-framework/downloads)

SBJson v3.1.1 - source and API docs for Mac and iOS development

ダウンロードします。


Main.storyboardでUIを作成します。
10個のLabelを配置します。

OpenWeatherMapの場所、天候、天候詳細、風速、風向を取得します。


ViewController.m

OpenWeatherMapに通信しお天気情報を習得します。

#import "ViewController.h"

#import "SBJson.h"



@interface ViewController ()

{


}


@property (weak, nonatomic) IBOutlet UILabel *label1;

@property (weak, nonatomic) IBOutlet UILabel *label2;

@property (weak, nonatomic) IBOutlet UILabel *label3;

@property (weak, nonatomic) IBOutlet UILabel *label4;

@property (weak, nonatomic) IBOutlet UILabel *label5;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib

    

    // OpenWeatherMap APIのリクエストURLをセット

    NSString *url = @"http://api.openweathermap.org/data/2.5/weather?q=Osaka,jp";

    

    // 天気アイコン取得方法

    // http://openweathermap.org/img/w/"iconの値".png

    

    // リクエストURLUTF8でエンコード

    // stringByAddingPercentEscapesUsingEncodingを使うとAPIでよく使われる&はエスケープされません

    NSString *urlEscapeStr = [[NSString  stringWithString:url] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    

    // 通信するためにNSMutableURLRequest型のrequestを作成

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]

                                    initWithURL:[NSURL URLWithString:urlEscapeStr]

                                    cachePolicy:NSURLRequestReloadIgnoringLocalCacheData

                                timeoutInterval:15];

    

    // 通信

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request

                                                 returningResponse:nil

                                                             error:nil];

    

    // ここからSBJsonを利用します。まずはSBJsonを初期化

    SBJsonParser* parser = [[SBJsonParser alloc]init];

    

    // JSON形式で来たデータをNSDictionary型に格納

    NSDictionary *result = [parser objectWithData:responseData];

    

    // JSONの中身をLog表示

    NSLog(@"JSON dictionary=%@", [result description]);

    

    

    // weather.mainの値を抽出してラベルに表示

    NSArray *main = [result valueForKeyPath:@"weather.main"]; //天候

    NSArray *description = [result valueForKeyPath:@"weather.description"]; // 天候詳細

    NSArray *deg = [result valueForKeyPath:@"wind.deg"]; // 風向き

    NSArray *speed = [result valueForKeyPath:@"wind.speed"]; //風速

    

    //self.label2.text = [result objectForKey:@"wind.speed"]; // 名前

    

    NSLog(@"天候:%@ 天候詳細:%@ 風速:%@ 風向き:%@", main, description, speed, deg);


    //  label1ViewController.xibでセットしたラベルになります。

    NSString *weather01 = main[0];

    NSString *weather02 = description[0];

    

    self.label1.text = [result objectForKey:@"name"]; // 場所

    //self.label2.text = [result objectForKey:@"weather.main"]; // 天候

    self.label2.text = weather01; // 天候

    //self.label3.text = [result objectForKey:@"weather.description"]; // 天候

    self.label3.text = weather02; // 天候詳細

    self.label4.text = [NSString stringWithFormat:@"%@",speed]; //風速

    self.label5.text = [NSString stringWithFormat:@"%@",deg]; // 風向き

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end

 

注意事項

数値データに関しては、stringWithFormatをかえしてしないとLabelに表示しなくEXC_BAD_ACCESSが発生します。


NSArray *speed = [result valueForKeyPath:@"wind.speed"]; //風速

self.label4.text = [NSString stringWithFormat:@"%@",speed]; //風速


 

GitHub WeatherSBJson

GitHub

  

目 次