【学習用】ネット情報から天気予報取得するサンプル
Newtonsoft.Jsonの場合と、System.Text.Jsonの場合を列記してみました
このサンプルは学習用です
実際の情報取得はできません
概要
このサンプルは、天気予報サービスから天気情報を取得し、その結果をグラフィカルインターフェースに表示するWindowsフォームアプリケーションです。
フォームには、都市名を選択するためのコンボボックス、天気アイコンを表示するイメージボックス、メニューが含まれています。
都市名が選択されると、都市名から都市コードを取得して天気予報APIにアクセスします。取得した天気情報は、JSON形式の文字列として返されます。この文字列をデシリアライズすることで、天気情報オブジェクトを生成し、天気アイコンを表示するイメージボックスに表示します。
また、メニューから終了が選択されると、アプリケーションが終了します。
usingで登録されている名前空間一覧
ライブラリ名 | 説明 |
---|---|
System.Net.Http | HTTP通信を行うためのライブラリ |
System.Text.Encodings.Web | Web上で使われる文字エンコーディングを扱うためのライブラリ |
System.Text.Json | JSONを扱うためのライブラリ |
System.Text.Unicode | Unicode文字を扱うためのライブラリ |
System.Threading.Tasks | 非同期処理を行うためのライブラリ |
Newtonsoft.Json | JSONを扱うためのライブラリ |
System | 共通的な操作を行うためのライブラリ |
System.Collections.Generic | ジェネリックなコレクションを扱うためのライブラリ |
System.Windows.Forms | Windowsフォームアプリケーションを作成するためのライブラリ |
Newtonsoft.Jsonを使った場合
必要な作業
- 天気予報APIURLは置き換える必要があります
- NugetでNewtonsoft.Jsonのパッケージをインストールする必要があります
サンプルコード
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Windows.Forms;
namespace WeatherChecker
{
public partial class Form1 : Form
{
// 都市名とコードを紐付けるDictionary
private readonly Dictionary<string, string> cityNames = new Dictionary<string, string>
{
{ "東京都", "3" },
{ "大阪府", "1" },
{ "愛知県", "2" },
{ "福岡県", "10" }
};
public Form1()
{
InitializeComponent();
// 都市名をコンボボックスに追加
foreach (var data in cityNames)
{
areaBox.Items.Add(data.Key);
}
}
// 都市が選択されたときに呼び出されるイベントハンドラ
private async void CitySelected(object sender, EventArgs e)
{
// 都市名からコードを取得
var cityCode = cityNames[areaBox.Text];
// APIにアクセスするためのURLを生成
var url = $"天気予報APIURL{cityCode}";
// APIにアクセスして天気情報を取得(HttpClientを使用するためのusing構文)
using (var client = new HttpClient())
{
// HttpClientを使用して天気情報サービスからデータを取得する
var result = await client.GetStringAsync(url);
// JSON形式の文字列からWeatherInfoオブジェクトを生成
var weatherInfo = JsonConvert.DeserializeObject<WeatherInfo>(result);
// 取得した天気情報を表示
weatherIcon.ImageLocation = weatherInfo.Url;
}
}
private void ExitMenuClicked(object sender, EventArgs e)
{
// フォームを閉じる
Close();
}
}
// 天気情報を格納するクラス
public class WeatherInfo
{
// 都市名を保持するプロパティ
public string City { get; set; }
// 天気を保持するプロパティ
public string Weather { get; set; }
// 経度・緯度を保持するプロパティ
public Location Location { get; set; }
// 天気予報の確率を保持するプロパティ
public int Percent { get; set; }
// 湿度を保持するプロパティ
public int Humidity { get; set; }
// 気温を保持するプロパティ
public int Temp { get; set; }
// 風速を保持するプロパティ
public double Wind { get; set; }
// 気圧を保持するプロパティ
public int Pressure { get; set; }
// 天気アイコンの画像のURLを保持するプロパティ
public string Url { get; set; }
}
// 場所の情報を保持するクラス
public class Location
{
// 経度を保持するプロパティ
public string Longitude { get; set; }
// 緯度を保持するプロパティ
public string Latitude { get; set; }
}
}
System.Text.Jsonを使った場合(Forn1.csファイルのみで完結する場合)
マイクロソフトは、こちらに置き換えを推奨しています
必要な作業
- 天気予報APIURLは置き換える必要があります
- NugetでNewtonsoft.Jsonのパッケージをインストールされている場合、アンインストールする必要があります
- .NetFramework版のWindowsFormsアプリを制作の場合、NugetでSystem.Text.Jsonのパッケージをインストールする必要があります
サンプルコード
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
using System.Windows.Forms;
namespace WeatherChecker
{
public partial class Form1 : Form
{
//天気予報APIのURL
public string WEATHER_API_URL { get; set; } = "天気予報APIURL";
// 都市名とコードを紐付けるディクショナリ
private readonly Dictionary<string, string> cityNames = new Dictionary<string, string>
{
["東京都"] = "3",
["大阪府"] = "1",
["愛知県"] = "2",
["福岡県"] = "10",
};
public Form1()
{
InitializeComponent();
// 都市名をコンボボックスに追加
foreach (var data in cityNames)
{
areaBox.Items.Add(data.Key);
}
}
JsonSerializerOptions serializeOptions = new JsonSerializerOptions
{
// すべての JSON プロパティ名にキャメル ケースを使用
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
// 日本語が表示できるようにする
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
// インデントフォーマットあり
WriteIndented = true
};
// 都市が選択されたときに呼び出されるイベントハンドラ
private async void CitySelected(object sender, EventArgs e)
{
// 都市名からコードを取得
var cityCode = cityNames[areaBox.Text];
// APIにアクセスするためのURLを生成
var url = $"{WEATHER_API_URL}?city={cityCode}";
// 天気情報データの取得した結果を格納する変数
string result = "";
// APIにアクセスして天気情報を取得(HttpClientを使用するためのusing構文)
using (var client = new HttpClient())
{
// HttpClientを使用して天気情報サービスからデータを取得する
result = await client.GetStringAsync(url);
}
// JSON形式の文字列からWeatherInfoオブジェクトを生成
var weatherInfo = JsonSerializer.Deserialize<WeatherInfo>(result, serializeOptions);
// 取得した天気情報を表示
weatherIcon.ImageLocation = weatherInfo.Url;
}
// メニューから終了が選択されたときに呼び出されるイベントハンドラ
private void ExitMenuClicked(object sender, EventArgs e)
{
// フォームを閉じる
Close();
}
}
// 天気情報を格納するクラス
public class WeatherInfo
{
// 都市名を保持するプロパティ
public string City { get; set; }
// 天気を保持するプロパティ
public string Weather { get; set; }
// 経度・緯度を保持するプロパティ
public Location Location { get; set; }
// 天気予報の確率を保持するプロパティ
public string Percent { get; set; }
// 湿度を保持するプロパティ
public string Humidity { get; set; }
// 気温を保持するプロパティ
public string Temp { get; set; }
// 風速を保持するプロパティ
public string Wind { get; set; }
// 気圧を保持するプロパティ
public string Pressure { get; set; }
// 天気アイコンの画像のURLを保持するプロパティ
public string Url { get; set; }
}
// 場所の情報を保持するクラス
public class Location
{
// 経度を保持するプロパティ
public string Longitude { get; set; }
// 緯度を保持するプロパティ
public string Latitude { get; set; }
}
}
System.Text.Jsonを使った場合(責務に応じてクラス分けした場合)
Form1クラス
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WeatherChecker
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ShowCityName();
}
// 都市選択コンボボックスに表示
private void ShowCityName()
{
// 都市名をコンボボックスに追加
foreach (var data in CityInfo.Names)
{
areaBox.Items.Add(data.Key);
}
}
// 都市が選択されたときに呼び出されるイベントハンドラ
private async void CitySelected(object sender, EventArgs e)
{
// 都市名からコードを取得
var cityCode = CityInfo.Names[areaBox.Text];
var weatherInfo = await Task.Run(() => WeatherNews.GetWeatherNewsAsync(cityCode));
// 取得した天気情報を表示
weatherIcon.ImageLocation = weatherInfo.Url;
}
// メニューから終了が選択されたときに呼び出されるイベントハンドラ
private void ExitMenuClicked(object sender, EventArgs e)
{
// フォームを閉じる
Close();
}
}
}
このコードは、Windowsフォームアプリケーションの一部であり、「WeatherChecker」という名前空間に含まれています。
このアプリケーションは、天気情報を表示するものであり、ユーザーが都市を選択することができます。選択された都市の天気情報は、インターネットから取得され、画像として表示されます。
メインの部分となるのは、Form1クラスです。このクラスは、Windowsフォームの初期化と、イベントハンドラを定義しています。
Form1
クラスのコンストラクタ:初期化されたコンポーネントを表示し、ShowCityName
メソッドを呼び出します。ShowCityName
メソッド:都市名を選択するためのコンボボックスに表示します。CitySelected
イベントハンドラ:都市が選択されたときに呼び出されます。選択された都市の天気情報を取得し、画像として表示します。ExitMenuClicked
イベントハンドラ:メニューから終了が選択されたときに呼び出されます。フォームを閉じます。
このアプリケーションでは、System
、System.Threading.Tasks
、System.Windows.Forms
という名前空間を使用しています。
CityInfoクラス
using System.Collections.Generic;
namespace WeatherChecker
{
internal class CityInfo
{
// 都市名とコードを紐付けるディクショナリ
public static readonly Dictionary<string, string> Names = new Dictionary<string, string>
{
["東京都"] = "3",
["大阪府"] = "1",
["愛知県"] = "2",
["福岡県"] = "10",
};
}
}
このコードは、「WeatherChecker」という名前空間に、「CityInfo」という名前のクラスを定義しています。
「CityInfo」クラスは、都市名と都市コードを紐付ける「Names」という名前の読み取り専用のディクショナリ(順番を保持しないキーと値のセット)を保持しています。
この「Names」ディクショナリは、「東京都」をキーとして「3」を値に、「大阪府」をキーとして「1」を値に、「愛知県」をキーとして「2」を値に、「福岡県」をキーとして「10」を値に紐付けています。
WeatherNewsクラス
using System.Net.Http;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
using System.Threading.Tasks;
namespace WeatherChecker
{
internal class WeatherNews
{
//天気予報APIのURL
public static string WEATHER_API_URL { get; set; } = "https://and-idea.sbcr.jp/sp/90261/weatherCheck.php";
// JSONシリアル化のオプションを定義
static JsonSerializerOptions serializeOptions = new JsonSerializerOptions
{
// すべての JSON プロパティ名にキャメル ケースを使用
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
// 日本語が表示できるようにする
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
// インデントフォーマットあり
WriteIndented = true
};
// 非同期で天気情報を取得するメソッド
// 引数に都市コードを受け取り、WeatherInfo型のタスクを返します
public static async Task<WeatherInfo> GetWeatherNewsAsync(string cityCode)
{
// APIにアクセスするためのURLを生成
var url = $"{WEATHER_API_URL}?city={cityCode}";
// 天気情報データの取得した結果を格納する変数
string result = "";
// APIにアクセスして天気情報を取得(HttpClientを使用するためのusing構文)
using (var client = new HttpClient())
{
// HttpClientを使用して天気情報サービスからデータを取得する
result = await client.GetStringAsync(url);
}
// JSON形式の文字列からWeatherInfoオブジェクトを生成
return JsonSerializer.Deserialize<WeatherInfo>(result, serializeOptions);
}
// 天気情報を保持するクラス
public class WeatherInfo
{
// 都市名を保持するプロパティ
public string City { get; set; }
// 天気を保持するプロパティ
public string Weather { get; set; }
// 経度・緯度を保持するプロパティ
public Location Location { get; set; }
// 天気予報の確率を保持するプロパティ
public string Percent { get; set; }
// 湿度を保持するプロパティ
public string Humidity { get; set; }
// 気温を保持するプロパティ
public string Temp { get; set; }
// 風速を保持するプロパティ
public string Wind { get; set; }
// 気圧を保持するプロパティ
public string Pressure { get; set; }
// 天気アイコンの画像のURLを保持するプロパティ
public string Url { get; set; }
}
// 場所の情報を保持するクラス
public class Location
{
// 経度を保持するプロパティ
public string Longitude { get; set; }
// 緯度を保持するプロパティ
public string Latitude { get; set; }
}
}
}
このコードは天気予報APIから天気情報を取得し、その天気情報を格納するクラスを生成するものです。
まず、WeatherNews
クラス内で、天気予報APIのURLを定義しています。次に、JsonSerializerOptions
オブジェクトを生成し、JSONのシリアル化オプションを設定しています。ここでは、キャメルケースを使用してプロパティ名を出力するように設定し、日本語の表示ができるように設定し、インデントフォーマットを使用するように設定しています。
次に、GetWeatherNewsAsync
メソッドは、指定された都市の天気情報を取得するために天気予報APIにアクセスします。このメソッドでは、APIにアクセスするためのURLを生成し、HttpClient
を使用して天気情報を取得します。取得した天気情報はJSON形式の文字列として返されます。最後に、このJSON文字列をJsonSerializer.Deserialize
メソッドを使用して、WeatherInfo
オブジェクトに変換して返します。
最後に、WeatherInfo
クラスとLocation
クラスが定義されています。これらのクラスは、天気情報を保持するプロパティを持っています。例えば、WeatherInfo
クラスには、都市名、天気、経度・緯度、気温などの情報が含まれます。
ディスカッション
コメント一覧
まだ、コメントがありません