お天気情報をJSONでくれるWebAPIがあるので、それを利用してお天気アプリを作成しよう。
WebAPI確認
1.まずはWebAPIから吐き出されるJSONを確認しよう。
今回はlivedoorから提供されているWeather Hacks
のAPIを使用する。まずは東京のお天気情報のリクエストURLを叩いてレスポンスを確認しよう。
http://weather.livedoor.com/forecast/webservice/json/v1?city=130010
まるっとコピーしてJSON整形サイトで確認してもよいが、吐き出す内容が多いのでChromeにプラグインとしてインストールしたJSON formatterで確認してみる。
要素を折りたたむことができるので全体像をつかむのに便利だ。
2.アプリの仕様を決める。
すべての要素を盛り込んでアプリを作ってもいいが、今回は送信されるデータのうち、forecastsの中にある
datelabel,telop,dateを利用することとする。
アプリ作成
下準備
◯Visual Studioで新規コンソールアプリプロジェクトを作成したら、まずHttp通信ができるようする。
1.参照を右クリック
2.開いたメニューの検索窓にHttpと入力し、System.Net.Httpを選択し、OKボタンを押す
◯Jsonパースができるようにする。こんどはパッケージを右クリック。Manage NuGet Packages…をクリック
1.
2.開いたメニューの検索窓にJsonと入力し、Newtonsoft.Jsonにチェックをいれてパッケージを追加を押す
作成
◯Program.csに以下を追記
using System;
using System.Net.Http;
namespace WeatherApp {
class MainClass {
public static void Main(string[] args) {
//WebAPIのURL
string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010";
//HttpClientインスタンス作成(using System.Net.Http;を忘れないこと)
HttpClient client = new HttpClient();
//Get通信して結果を文字列として取得
string result = client.GetStringAsync(url).Result;
//結果を表示
Console.WriteLine(result);
}
}
}
コンソールにJsonデータが表示されれば成功だ。
続いてパースしていこう。
Program.csを以下のように変更。その際、先程の出力部分はコメントアウトしておくとよい。
using System;
using System.Net.Http;
using Newtonsoft.Json.Linq;
namespace WeatherApp {
class MainClass {
public static void Main(string[] args) {
//WebAPIのURL
string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010";
//HttpClientインスタンス作成(using System.Net.Http;を忘れないこと)
HttpClient client = new HttpClient();
//Get通信して結果を文字列として取得
string result = client.GetStringAsync(url).Result;
//結果を表示
//Console.WriteLine(result);コメントアウト
//今回はルートが{で始まるオブジェクトなのでJObject.Parse,ルートが配列の場合はJArray.Parseを用いる
//(using Newtonsoft.Json.Linq;を忘れないこと)
JObject jobj = JObject.Parse(result);
//表示してみる
Console.WriteLine(jobj);
}
}
}
下のようにきれいに表示されれば成功だ。
もう一度使う部分を確認しておこう。
"forecast":[ {}, {}, {} ]
forecastというのは配列でその中にオブジェクトが3つはいっていることがわかる。取得しよう。
まずはさきほど最後に書いたConsole.WriteLineをコメントアウトし、以下のように追記する。
using System; using System.Net.Http; using Newtonsoft.Json.Linq; namespace WeatherApp { class MainClass { public static void Main(string[] args) { //WebAPIのURL string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010"; //HttpClientインスタンス作成(using System.Net.Http;を忘れないこと) HttpClient client = new HttpClient(); //Get通信して結果を文字列として取得 string result = client.GetStringAsync(url).Result; //結果を表示 //Console.WriteLine(result); //今回はルートが{で始まるオブジェクトなのでJObject.Parse,ルートが配列の場合はJArray.Parseを用いる //(using Newtonsoft.Json.Linq;を忘れないこと) JObject jobj = JObject.Parse(result); //表示してみる //Console.WriteLine(jobj); //jobjが持つforecastsは配列なので以下のようにその配列部分を取得する。 JArray jarr = (JArray)jobj["forecasts"]; //jarrに入っているのはオブジェクトなので以下のようなforeachで回す foreach(JObject f in jarr) { //fとして取り出したJObjectのdateLabelは文字列なのでstringでキャストしてあげる string dateLabel = (string)f["dateLabel"]; //確認してみる Console.WriteLine(dateLabel); } } } }
おお!ラベル部分が3件取得できた!
では、また最後の部分のConsole.WriteLineをコメントアウトして以下を追記
using System; using System.Net.Http; using Newtonsoft.Json.Linq; namespace WeatherApp { class MainClass { public static void Main(string[] args) { //WebAPIのURL string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010"; //HttpClientインスタンス作成(using System.Net.Http;を忘れないこと) HttpClient client = new HttpClient(); //Get通信して結果を文字列として取得 string result = client.GetStringAsync(url).Result; //結果を表示 //Console.WriteLine(result); //今回はルートが{で始まるオブジェクトなのでJObject.Parse,ルートが配列の場合はJArray.Parseを用いる //(using Newtonsoft.Json.Linq;を忘れないこと) JObject jobj = JObject.Parse(result); //表示してみる //Console.WriteLine(jobj); //jobjが持つforecastsは配列なので以下のようにその配列部分を取得する。 JArray jarr = (JArray)jobj["forecasts"]; //jarrに入っているのはオブジェクトなので以下のようなforeachで回す foreach(JObject f in jarr) { //fとして取り出したJObjectのdateLabelは文字列なのでstringでキャストしてあげる string dateLabel = (string)f["dateLabel"]; //確認してみる //Console.WriteLine(dateLabel); string telop = (string)f["telop"]; string date = (string)f["date"]; Console.WriteLine($"{dateLabel}({date})...{telop}"); } } } }
以下のように3日分のお天気情報が表示されれば成功だ。
Newtonsoft.Jsonを用いるととても簡単にパースすることがわかった。
コメント