【学習用】ネット情報から天気予報取得するサンプル

Newtonsoft.Jsonの場合と、System.Text.Jsonの場合を列記してみました
このサンプルは学習用です
実際の情報取得はできません

概要

このサンプルは、天気予報サービスから天気情報を取得し、その結果をグラフィカルインターフェースに表示するWindowsフォームアプリケーションです。

フォームには、都市名を選択するためのコンボボックス、天気アイコンを表示するイメージボックス、メニューが含まれています。

都市名が選択されると、都市名から都市コードを取得して天気予報APIにアクセスします。取得した天気情報は、JSON形式の文字列として返されます。この文字列をデシリアライズすることで、天気情報オブジェクトを生成し、天気アイコンを表示するイメージボックスに表示します。

また、メニューから終了が選択されると、アプリケーションが終了します。

usingで登録されている名前空間一覧

ライブラリ名説明
System.Net.HttpHTTP通信を行うためのライブラリ
System.Text.Encodings.WebWeb上で使われる文字エンコーディングを扱うためのライブラリ
System.Text.JsonJSONを扱うためのライブラリ
System.Text.UnicodeUnicode文字を扱うためのライブラリ
System.Threading.Tasks非同期処理を行うためのライブラリ
Newtonsoft.JsonJSONを扱うためのライブラリ
System共通的な操作を行うためのライブラリ
System.Collections.Genericジェネリックなコレクションを扱うためのライブラリ
System.Windows.FormsWindowsフォームアプリケーションを作成するためのライブラリ

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イベントハンドラ:メニューから終了が選択されたときに呼び出されます。フォームを閉じます。

このアプリケーションでは、SystemSystem.Threading.TasksSystem.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クラスには、都市名、天気、経度・緯度、気温などの情報が含まれます。