Newtonsoft.JsonからSystem.Text.Jsonへの移行:C#での天気情報アプリケーション開発

概要

この資料では、C#を使用してWindowsフォームアプリケーションで天気情報を表示する方法を学びます。特に、JSONデータの解析において、Newtonsoft.JsonからSystem.Text.Jsonへの移行に焦点を当てています。初心者にも分かりやすいように、詳細なコメントとともにコードを解説します。


1. はじめに

C#でJSONデータを解析するために使用されるライブラリとして、Newtonsoft.Jsonが広く知られていますが、.NET Core 3.0以降、System.Text.Jsonが標準ライブラリとして提供されています。この資料では、天気情報を取得し表示するアプリケーションを作成しながら、Newtonsoft.JsonからSystem.Text.Jsonへの移行方法を学びます。


2. 前提条件

  • Visual Studioがインストールされていること
  • 基本的なC#の知識
  • Windowsフォームアプリケーションの基本的な理解

3. プロジェクトの作成

  1. Visual Studioを開き、新しいWindowsフォームアプリケーションプロジェクトを作成します。
    Windowsフォームアプリ(.NET版)を選択します
    プロジェクト名はWeatherCheckerByDotNetにします
  2. プロジェクトに必要なコントロール(コンボボックス、ピクチャーボックスなど)を追加します。

4. Newtonsoft.Jsonを使用したサンプルコード

まず、Newtonsoft.Jsonを使用したコードを見てみましょう。

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;

namespace WeatherChecker
{
    public partial class Form1 : Form
    {
        Dictionary<string, string> cityNames;

        public Form1()
        {
            InitializeComponent();
            this.cityNames = new Dictionary<string, string>
            {
                { "東京都", "3" },
                { "大阪府", "1" },
                { "愛知県", "2" },
                { "福岡県", "10" }
            };

            foreach (KeyValuePair<string, string> data in this.cityNames)
            {
                areaBox.Items.Add(data.Key);
            }
        }

        private async void CitySelected(object sender, EventArgs e)
        {
            string cityCode = cityNames[areaBox.Text];
            string url = $"天気予報URLcity={cityCode}";
            HttpClient client = new HttpClient();
            string result = await client.GetStringAsync(url);

            JObject jobj = JObject.Parse(result);
            string todayWeatherIcon = (string)jobj["url"];
            weatherIcon.ImageLocation = todayWeatherIcon;
        }

        private void ExitMenuClicked(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

5. System.Text.Jsonを使用したリファクタリング

次に、Newtonsoft.JsonをSystem.Text.Jsonに置き換えたコードを示します。

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Windows.Forms;

namespace WeatherCheckerByDotNet
{
    public partial class Form1 : Form
    {
        Dictionary<string, string> cityNames;

        public Form1()
        {
            InitializeComponent();
            this.cityNames = new Dictionary<string, string>
            {
                { "東京都", "3" },
                { "大阪府", "1" },
                { "愛知県", "2" },
                { "福岡県", "10" }
            };

            foreach (KeyValuePair<string, string> data in this.cityNames)
            {
                areaBox.Items.Add(data.Key);
            }
        }

        // 都市が選択されたときに呼び出されるメソッド
        private async void CitySelected(object sender, EventArgs e)
        {
            string cityCode = cityNames[areaBox.Text];
            string url = $"https://and-idea.sbcr.jp/sp/90261/weatherCheck.php?city={cityCode}";

            HttpClient client = new HttpClient();
            string result = await client.GetStringAsync(url);

            // JSONデータをWeatherInfoクラスにデシリアライズ
            WeatherInfo weatherInfo = JsonSerializer.Deserialize<WeatherInfo>(result);

            // 天気情報からアイコンのURLを取り出して表示
            string todayWeatherIcon = weatherInfo.Url;
            weatherIcon.ImageLocation = todayWeatherIcon;
        }

        private void ExitMenuClicked(object sender, EventArgs e)
        {
            this.Close();
        }
    }

    // 天気情報を表すクラス
    public class WeatherInfo
    {
        [JsonPropertyName("city")]
        public string City { get; set; }
        [JsonPropertyName("weather")]
        public string Weather { get; set; }
        [JsonPropertyName("location")]
        public Location Location { get; set; }
        [JsonPropertyName("percent")]
        public string Percent { get; set; }
        [JsonPropertyName("humidity")]
        public string Humidity { get; set; }
        [JsonPropertyName("temp")]
        public string Temp { get; set; }
        [JsonPropertyName("wind")]
        public string Wind { get; set; }
        [JsonPropertyName("pressure")]
        public string Pressure { get; set; }
        [JsonPropertyName("url")]
        public string Url { get; set; }
    }

    // 位置情報を表すクラス
    public class Location
    {
        [JsonPropertyName("longitude")]
        public string Longitude { get; set; }
        [JsonPropertyName("latitude")]
        public string Latitude { get; set; }
    }
}

主な変更点

  1. System.Text.Jsonを使用JObjectの代わりにJsonDocumentJsonElementを使用し、JsonSerializerを使ってデシリアライズしています。
  2. デシリアライズのためのクラス作成WeatherInfoLocationクラスを作成し、JSONデータをこれらのクラスにマッピングします。

6. 結論

System.Text.Jsonは、Newtonsoft.Jsonに比べて軽量で高速です。標準ライブラリであるため、追加のパッケージをインストールする必要がなく、.NET Core 3.0以降のプロジェクトで推奨されます。この資料を通じて、JSONデータの解析方法や、ライブラリの移行手順を学ぶことができました。


参考文献


この資料を使って、Newtonsoft.JsonからSystem.Text.Jsonへの移行に自信を持ち、C#でのJSONデータ解析スキルを向上させてください。

C#,JSON,VisualStudio

Posted by hidepon