お天気情報を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を用いるととても簡単にパースすることがわかった。

コメント