学習記事一覧 · 天気チェッカー

【学習】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 にコピーされるようにします。

  1. プロジェクトに weather フォルダを作成
  2. 上記の JSON ファイルを配置
  3. 各ファイルのプロパティで 出力ディレクトリにコピー新しい場合はコピーする に設定

天気情報を表すクラス

天気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 のデシリアライズは、多くのアプリで使う基本技術です。