ヤマムギ

growing hard days.

*

C#でOpenWeatherMap APIを使って天気情報を取得する

      2015/05/27

C#でOpenWeatherMapAPIを使って現在の天気を取得してみました。
本当は指定した日時の過去データを任意のタイミングで取りたかったのですが、サンプルURLでもJSONにアクセス出来なくエラーになるので、諦めて定期的にアクセスして自動的に自前のDBに蓄積する事とします。

DataContractクラスを作る

OpenWeatherMapAPIのCurrent Weather DataのJSONをパース出来るようにデータ構造のクラスを作ります。

JSONの例

例えば、http://api.openweathermap.org/data/2.5/weather?q=Osaka,jp&units=metric でアクセスすると下記のJSONにアクセス出来ます。

※「units=metric」で摂氏気温になります。

[xml]
{
coord: {
lon: 135.52,
lat: 34.65
},
sys: {
message: 0.3845,
country: “Japan”,
sunrise: 1432669673,
sunset: 1432720932
},
weather: [
{
id: 800,
main: “Clear”,
description: “Sky is Clear”,
icon: “01n”
}
],
base: “stations”,
main: {
temp: 15.327,
temp_min: 15.327,
temp_max: 15.327,
pressure: 1004.14,
sea_level: 1025.02,
grnd_level: 1004.14,
humidity: 77
},
wind: {
speed: 0.97,
deg: 327.5
},
clouds: {
all: 0
},
dt: 1432736103,
id: 7303469,
name: “Osaka-Wan”,
cod: 200
}
[/xml]

DataContractクラス

階層や配列に対応して記述しています。
ご参考までに。

[c]
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace WeatherDataTest
{
[DataContract]
public class WeatherDataTestJsonContract
{
[DataMember]
public Coord coord { get; set; }
[DataContract]
public class Coord
{
[DataMember]
public double lon { get; set; }
[DataMember]
public double lat { get; set; }
}
[DataMember]
public Sys sys { get; set; }
[DataContract]
public class Sys
{
[DataMember]
public double message { get; set; }
[DataMember]
public string country { get; set; }
[DataMember]
public long sunrise { get; set; }
[DataMember]
public long sunset { get; set; }
}
[DataMember]
public List weather { get; set; }
[DataContract]
public class Weather
{
[DataMember]
public int id { get; set; }
[DataMember]
public string main { get; set; }
[DataMember]
public string description { get; set; }
[DataMember]
public string icon { get; set; }
}
[DataMember (Name=”base”)]
public string baseItem{get;set;}
[DataMember]
public Main main { get; set; }
[DataContract]
public class Main
{
[DataMember]
public double temp { get; set; }
[DataMember]
public double temp_min { get; set; }
[DataMember]
public double temp_max { get; set; }
[DataMember]
public double pressure { get; set; }
[DataMember]
public double sea_level { get; set; }
[DataMember]
public double grnd_level { get; set; }
[DataMember]
public double humidity { get; set; }
}
[DataMember]
public Wind wind { get; set; }
[DataContract]
public class Wind
{
[DataMember]
public double speed { get; set; }
[DataMember]
public double deg { get; set; }
}
[DataMember]
public Clouds clouds { get; set; }
[DataContract]
public class Clouds
{
[DataMember]
public double all { get; set; }
}
[DataMember]
public long dt { get; set; }
[DataMember]
public long id { get; set; }
[DataMember]
public string name { get; set; }
[DataMember]
public long cod { get; set; }
}
}
[/c]

気温と天気IDを取得する例

[c]
using System.Runtime.Serialization.Json;

namespace WeatherDataTest
{
public static void main(String[] args)
{
string jsonUri = “http://api.openweathermap.org/data/2.5/weather?q=Osaka,jp&units=metric”;
try
{
var json = new WebClient().DownloadString(jsonUri);
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(WeatherDataImportJsonContract));
using (MemoryStream memorystream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
WeatherDataImportJsonContract jsonData = (WeatherDataImportJsonContract)serializer.ReadObject(memorystream);
double temp = jsonData.main.temp; //気温
int id = jsonData.weather[0].id; //天気ID
}
}
catch (Exception e){}
}
}
[/c]


最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - C#, Web ,

ad

ad

  関連記事

Youtube動画のダウンロード

Youtubeにアップロードした動画のダウンロード方法です。 以前はこんな機能が …

PostmanでTwitter API 1.1を使う

AWS Lambda(Python)からTwitterに投稿するで取得した認証情 …

Google Apps ScriptでAdmin SDK Directory Serviceを使ってユーザの最終ログイン情報一覧を出力する

GoogleAppsで使わなくなったアカウントを確認する方法として、最終ログイン …

PHP 共通ヘッダ、フッタの内容をページによって動的に変更する

共通ヘッダ、フッタ それぞれ必要な内容を書いたheader.php、footer …

「POODLE」SSL3.0の脆弱性対応

各社が騒ぎ立てている「POODLE」 Padding Oracle On Dow …

Googleカレンダーの予定をPHPからXMLで取得してWebページに表示する(現在廃止されたAPIなので使えません)

ご注意 ※下記の記事で使用していたAPIは2016年現在使用出来なくなっています …

Windows 8 にnode.js + mongodb 環境を作る

node.jsインストール nodejs.orgサイトで「INSTALL」ボタン …

ホームページ、自作サイトにアメブロの新着情報を掲載する

MagipieRSSを使用 なので下記サイトでダウンロード http://mag …

Chrome リモートデスクトップを使ってみる

自宅のMacをリモートで操作したい 外出用PCはWindows 8 とLinux …

ブログの記事が掲載されました(レバテック様)

少し前の話になりますが、登壇する側も聞く側も良い刺激を受けられる!勉強会のレポー …