OpenWeatherMapの天気情報を使用したiPhoneアプリを制作したく「Web-APIを使ってJSON形式でデータを取得したい!」を参考にしJSONデータのパース方法をまとめました。
取得結果(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
// ② リクエストURLをUTF8でエンコード
// ※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);
// label1はViewController.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
▫️参考にしたページ
By geographic coordinates 地理座標
OpenWeatherMap JSON API v2.5(Androidからの利用方法メモ)
Objective-CでJSONをパースする SBJson
OpenWeatherMap API v2.5から天気を取得する
WizFi250 get weather data from OpenWeatherMap Youtube
1 Xocde Weather App OpenWeather Class
2 Xocde Weather App OpenWeather Delegate protocol Youtube
3 Xocde Weather App Network Helpers
1 Open Weather Map API Youtube
2 Xcode IBOutlets UILabel text
3 Xcode IBOutlets UIImage image
iOS Programming 15 - Parsing a remote JSON data OpenWeatherMap Youtube
Tutorial: Building A Weather App With Functional Objective-C Programming Using ReactiveCocoa
コメントをお書きください