【学習】WinFormsで作る天気チェッカー(ローカルJSON版)
クラスで整理する版では、クラスを使って天気チェッカーを作る基本を学びました。
今回は ローカルの JSON ファイル から天気情報を読み込む版を作ります。ネットワーク不要で動作するため、オフライン環境や動作確認に適しています。
今日作るもの
ComboBox で地域を選ぶと、
天気アイコンが PictureBox に表示されるという動きをします。API の代わりに、プロジェクト内の JSON ファイルを読み込みます。
前提
- クラスで整理する版 を一通り学んでいること
- または、WinForms・クラス・ファイル読み込みの基本を理解していること
JSON ファイルの配置
プロジェクトの bin\Debug フォルダ(実行ファイルと同じ場所)に、次の JSON ファイルを配置します。
| ファイル名 | 地域 |
|---|---|
| weather_130010.json | 東京都 |
| weather_270000.json | 大阪府 |
| weather_230010.json | 愛知県 |
| weather_400010.json | 福岡県 |
ファイル名の数字部分は都市IDです。天気API版 と同じ ID を使うと、後から API 版に切り替えやすくなります。
JSON ファイルの形式
各ファイルは次の形式で作成します。天気アイコンの URL を url に書きます。
weather_130010.json(東京都の例)
{
"forecasts": [
{
"image": {
"url": "https://www.jma.go.jp/bosai/forecast/img/100.svg"
}
}
]
}気象庁の天気アイコンは 気象庁 HP で公開されています。例:晴れ=100.svg、曇り=200.svg、雨=300.svg。
ファイルを出力フォルダにコピーする
JSON ファイルをプロジェクトフォルダに置き、ビルド時に bin\Debug にコピーされるようにします。
- プロジェクトに weather フォルダを作成
- 上記の JSON ファイルを配置
- 各ファイルのプロパティで 出力ディレクトリにコピー を 新しい場合はコピーする に設定
天気情報を表すクラス
天気API版 と同じクラスが使えます。
WeatherApiResponse.cs(天気API版と同じ)
using Newtonsoft.Json;
using System.Collections.Generic;
class WeatherApiResponse
{
[JsonProperty("forecasts")]
public List<ForecastItem> Forecasts { get; set; }
}
class ForecastItem
{
[JsonProperty("image")]
public ImageItem Image { get; set; }
}
class ImageItem
{
[JsonProperty("url")]
public string Url { get; set; }
}Form1.cs の変更点
クラス版・天気API版との違いは データの取得方法 だけです。
- API 版:
HttpClient.GetStringAsync(url)でネットから取得 - ローカル版:
File.ReadAllText(path)でファイルから取得
private void CitySelected(object sender, EventArgs e)
{
string selectedName = areaBox.Text;
CityInfo city = FindCity(selectedName);
if (city == null) return;
string path = $"weather_{city.Code}.json";
string json = System.IO.File.ReadAllText(path);
var response = JsonConvert.DeserializeObject<WeatherApiResponse>(json);
weatherIcon.ImageLocation = response.Forecasts[0].Image.Url;
}完成コード(Form1.cs)
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using Newtonsoft.Json;
namespace WeatherChecker
{
public partial class Form1 : Form
{
List<CityInfo> cities;
public Form1()
{
InitializeComponent();
cities = new List<CityInfo>
{
new CityInfo { Name = "東京都", Code = "130010" },
new CityInfo { Name = "大阪府", Code = "270000" },
new CityInfo { Name = "愛知県", Code = "230010" },
new CityInfo { Name = "福岡県", Code = "400010" }
};
foreach (var city in cities)
{
areaBox.Items.Add(city.Name);
}
}
private void CitySelected(object sender, EventArgs e)
{
string selectedName = areaBox.Text;
CityInfo city = FindCity(selectedName);
if (city == null) return;
string path = $"weather_{city.Code}.json";
string json = File.ReadAllText(path);
var response = JsonConvert.DeserializeObject<WeatherApiResponse>(json);
weatherIcon.ImageLocation = response.Forecasts[0].Image.Url;
}
private CityInfo FindCity(string name)
{
foreach (var c in cities)
{
if (c.Name == name) return c;
}
return null;
}
private void ExitMenuClicked(object sender, EventArgs e)
{
this.Close();
}
}
}プログラムの流れ
フォーム起動
↓
List<CityInfo> を初期化
↓
ComboBox に都市名を表示
↓
ユーザーが都市を選択
↓
CitySelected が呼ばれる
↓
weather_{Code}.json を File.ReadAllText で読み込み
↓
JSON を WeatherApiResponse にデシリアライズ
↓
PictureBox にアイコンURLを設定ローカル版のメリット
- ネット不要:オフラインで動作確認できる
- 安定:API の障害やレート制限の影響を受けない
- 学習向き:ファイル読み込みと JSON の扱いを学べる
- API 版との共通化:クラス構造を揃えると、API 版への切り替えが簡単
重要ポイント
- File.ReadAllText:テキストファイルを一括読み込み
- 相対パス:実行ファイルと同じフォルダに JSON を置く
- 出力にコピー:プロジェクト内のファイルをビルド先にコピーする設定
- 同じクラス:API 版と JSON 形式を揃えると再利用しやすい
発展アイデア
- JSON ファイルを 天気API版 のレスポンスで生成する
- ネット接続時は API、オフライン時はローカル JSON に切り替える
- 天気の説明文(telop)や気温を JSON に追加して表示する
まとめ
ローカル JSON を使うと、ネットワークなしで天気チェッカーを動かせます。ファイル読み込みと JSON のデシリアライズは、多くのアプリで使う基本技術です。