2020年7月31日、「livedoor 天気」のサービスは終了しました。新しく別のAPIで天気予報を取得するアプリケーションを作成したのでこちらをごらんください。
ネタがなくなってきたので、今回はライブドアのお天気Webサービスを使ってプログラミングをしてみました。
お天気Webサービス仕様は以下のようになっています。
それではやってみましょう。
JSONデータをリクエストする際のベースとなるURLは以下になります。
http://weather.livedoor.com/forecast/webservice/json/v1
ここにパラメータを加えてリクエストします。
パラメータ名はcity。地域別に定義されたID番号を表します。東京であれば130010を指定します。http://weather.livedoor.com/forecast/webservice/json/v1?city=130010でリクエストをすればよいということになります。
リクエストをするとレスポンスが返ってきますが、このときにJSONデータは、
http://weather.livedoor.com/weather_hacks/webservice
を参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; using System.Text; using System.Windows.Forms; using System.Net; using System.Runtime.Serialization; public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { richTextBox1.Text = GetWeatherText(); } } |
ボタンをクリックすると天気に関する情報を取得し、テキストで表示します。
ではリクエストに対するレスポンスをどのように処理すればいいのでしょうか?
JSONデータを扱うので[参照の追加]から System.Runtime.Serializationを追加します。これでDataContractJsonSerializerクラスを使うことができるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { private string GetWeatherText() { // 東京の天気を取得する string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010"; HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); Data data; using(HttpWebResponse res = (HttpWebResponse)req.GetResponse()) using(var stream = res.GetResponseStream()) { var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(Data)); data = (Data)serializer.ReadObject(stream); } // 以下、後述 } } |
1 2 3 4 |
string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=400040"; HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); HttpWebResponse res = (HttpWebResponse)req.GetResponse(); var stream = res.GetResponseStream(); |
このようにしてストリームを取得して
serializer.ReadObject(stream)とやればJSONデータを取得できます。ライブドアのお天気WebサービスのJSONデータ構造にあわせて以下のようなクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
[DataContract] public class Data { [DataMember] public string title { get; set; } [DataMember] public Location location { get; set; } [DataMember] public string link { get; set; } [DataMember] public string publicTime { get; set; } [DataMember] public Description description { get; set; } [DataMember] public Forecasts[] forecasts { get; set; } [DataMember] public PinpointLocation[] pinpointLocations { get; set; } [DataMember] public Copyright copyright { get; set; } } [DataContract] public class Location { [DataMember] public string city { get; set; } [DataMember] public string area { get; set; } [DataMember] public string prefecture { get; set; } } [DataContract] public class Description { [DataMember] public string text { get; set; } [DataMember] public string publicTime { get; set; } } [DataContract] public class Forecasts { [DataMember] public string date { get; set; } [DataMember] public string dateLabel { get; set; } [DataMember] public string telop { get; set; } [DataMember] public Image image { get; set; } [DataMember] public Temperature temperature { get; set; } [DataContract] public class Image { [DataMember] public string title { get; set; } [DataMember] public string link { get; set; } [DataMember] public string url { get; set; } [DataMember] public string width { get; set; } [DataMember] public string height { get; set; } } [DataContract] public class Temperature { [DataMember] public Min min { get; set; } [DataMember] public Max max { get; set; } [DataContract] public class Min { [DataMember] public string celsius { get; set; } [DataMember] public string fahrenheit { get; set; } } [DataContract] public class Max { [DataMember] public string celsius { get; set; } [DataMember] public string fahrenheit { get; set; } } } } [DataContract] public class PinpointLocation { [DataMember] public string name { get; set; } [DataMember] public string link { get; set; } } [DataContract] public class Copyright { [DataMember] public string title { get; set; } [DataMember] public string link { get; set; } [DataMember] public Image image { get; set; } [DataMember] public Provider[] provider { get; set; } [DataContract] public class Image { [DataMember] public string width { get; set; } [DataMember] public string link { get; set; } [DataMember] public string url { get; set; } [DataMember] public string title { get; set; } [DataMember] public string height { get; set; } } [DataContract] public class Provider { [DataMember] public string name { get; set; } [DataMember] public string link { get; set; } } } |
1 2 |
var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(Data)); Data data = (Data)serializer.ReadObject(stream); |
とやればJSONデータが取得できるので、あとはdataに格納されたデータを取得して表示させるだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
private string GetWeatherText() { string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=400040"; HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); Data data; using(HttpWebResponse res = (HttpWebResponse)req.GetResponse()) using(var stream = res.GetResponseStream()) { var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(Data)); data = (Data)serializer.ReadObject(stream); } StringBuilder sb = new StringBuilder(); //title タイトル・見出し sb.Append("タイトル" + data.title + "\n"); sb.Append("\n"); //location 予報を発表した地域を定義 // area 地方名(例・九州地方) // prefecture 都道府県名(例・福岡県) // city 1次細分区名(例・八幡) sb.Append("地方名:" + data.location.area + "\n"); sb.Append("都道府県名:" + data.location.prefecture + "\n"); sb.Append("1次細分区名:" + data.location.city + "\n"); sb.Append("\n"); //link リクエストされたデータの地域に該当するlivedoor 天気情報のURL sb.Append("天気情報のURL:" + data.link + "\n"); sb.Append("\n"); // publicTime 予報の発表日時 sb.Append("予報の発表日時:" + data.publicTime + "\n"); sb.Append("\n"); // description 天気概況文 // text 天気概況文 // publicTime 天気概況文の発表時刻 sb.Append("天気概況文:" + data.description.text + "\n"); sb.Append("天気概況文の発表時刻:" + data.description.publicTime + "\n"); sb.Append("\n"); //forecasts 府県天気予報の予報日毎の配列 // date 予報日 // dateLabel 予報日(今日、明日、明後日のいずれか) // telop 天気(晴れ、曇り、雨など) // image // title 天気(晴れ、曇り、雨など) // link リクエストされたデータの地域に該当するlivedoor 天気情報のURL // url 天気アイコンのURL // width 天気アイコンの幅 // height 天気アイコンの高さ // temperature // max・・・最高気温 // min・・・最低気温 // celsius 摂氏 // fahrenheit 華氏 foreach(var o in data.forecasts) { sb.Append("予報日:" + o.date + "\n"); //sb.Append("予報日" + o.dateLabel + "\n"); sb.Append("天気:" + o.telop + "\n"); if(o.temperature.min != null) sb.Append("最低気温:" + o.temperature.min.celsius + "\n"); else sb.Append("最低気温:不明" + "\n"); if(o.temperature.max != null) sb.Append("最高気温:" + o.temperature.max.celsius + "\n"); else sb.Append("最高気温:不明" + "\n"); sb.Append("\n"); } // pinpointLocation ピンポイント予報の発表地点の配列 // name 市区町村名 // link 対応するlivedoor 天気情報のURL foreach(var o in data.pinpointLocations) { sb.Append("市区町村名:" + o.name + "\n"); sb.Append("天気情報のURL:" + o.link + "\n"); sb.Append("\n"); } sb.Append("\n"); // copyright // title コピーライトの文言 // link livedoor 天気情報のURL // image livedoor 天気情報へのURL、アイコンなど // width // link // url // title // height // provider livedoor 天気情報で使用している気象データの配信元 // link // name sb.Append("コピーライトの文言:" + data.copyright.title + "\n"); sb.Append("天気情報のURL:" + data.copyright.link + "\n"); foreach(var prov in data.copyright.provider) { sb.Append("天気情報で使用している気象データの配信元:" + prov.name + "\n"); sb.Append("天気情報で使用している気象データの配信元Url:" + prov.link + "\n"); } return sb.ToString(); } |
あとはGetWeatherTextメソッドが返した文字列を取得するだけです。
1 2 3 4 5 6 7 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { richTextBox1.Text = GetWeatherText(); } } |