Jsonデータの解析方法のいろいろ

2023年2月13日

2種類のJsonコンバータライブラリを比較してみます

Newtonsoft.Jsonのライブラリを使った場合

using Newtonsoft.Json;の名前空間を使います

NewtonsoftのJson.NETドキュメント

url項目が存在する前提

サンプル1
// 天気情報からアイコンのURLを取り出す
JObject jobj = JObject.Parse(result);
string todayWeatherIcon = (string)((jobj["url"] as JValue).Value);
weatherIcon.ImageLocation = todayWeatherIcon;

このコードは天気情報を取得し、その中からアイコンのURLを抽出しています。

  1. JObject.Parseメソッドを使って、APIから取得した天気情報の文字列をJObject形式に変換します。この変換は、"JObject.Parse" メソッドを使用することによって行われます。
  2. JObjectの中から「url」というキーの値を抽出します。
  3. JValue型に変換(キャスト)します。
    ("JValue" 型は、JSON のプリミティブな値(文字列、数値、真偽値など)を表します)
  4. そのValueプロパティからURLの実際の文字列を取り出します。
  5. 取り出したURLをweatherIconオブジェクトのImageLocationプロパティに設定します。これにより、アイコン画像が表示されます。

文字列補完($記号)に変更したもの

// 天気情報からアイコンのURLを取り出す
JObject jobj = JObject.Parse(result);
string todayWeatherIcon = $"{(jobj["url"] as JValue).Value}";
weatherIcon.ImageLocation = todayWeatherIcon;
サンプル2
// 天気情報からアイコンのURLを取り出す
dynamic weatherData = JsonConvert.DeserializeObject(result);
string todayWeatherIcon = weatherData.url;
weatherIcon.ImageLocation = todayWeatherIcon;
  • JsonConvert.DeserializeObject(result):この行では、取得した天気情報(文字列)をJSON形式からデシリアライズ(オブジェクトに変換)します。この変換されたオブジェクトは変数weatherDataに格納されます。
  • string todayWeatherIcon = weatherData.url;:この行では、変数weatherDataから天気アイコンのURLを抽出して、変数todayWeatherIconに格納します。
  • weatherIcon.ImageLocation = todayWeatherIcon;:この行では、変数todayWeatherIconに格納されたURLを使用して、weatherIconという画像コントロールに天気アイコンを表示します。

url項目等の情報をクラスで定義しておく

// 天気情報からアイコンのURLを取り出す
WeatherInfo weatherData = JsonConvert.DeserializeObject<WeatherInfo>(result);
string todayWeatherIcon = weatherData.url;
weatherIcon.ImageLocation = todayWeatherIcon;
  • WeatherInfo weatherData = JsonConvert.DeserializeObject(result); この行では、文字列形式の天気情報 result を WeatherInfo クラス型に変換しています。変換には、Newtonsoft.Json ライブラリの DeserializeObject メソッドを使用しています。
  • string todayWeatherIcon = weatherData.url; この行では、変換した天気情報の WeatherInfo クラスの url プロパティからアイコンのURLを取り出しています。
  • weatherIcon.ImageLocation = todayWeatherIcon; この行では、取り出したアイコンのURLを、weatherIcon オブジェクトの ImageLocation プロパティに設定しています。これにより、画像の読み込み先が変更され、アイコンが表示されることになります。
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; }
    public string url { get; set; }
}

public class Location
{
    public string longitude { get; set; }
    public string latitude { get; set; }
}

System.Text.Jsonライブラリを使った場合

using System.Text.Json;の名前空間を使います

url項目が存在する前提

// 天気情報からアイコンのURLを取り出す
JsonDocument document = JsonDocument.Parse(result);
string todayWeatherIcon = document.RootElement.GetProperty("url").GetString();
weatherIcon.ImageLocation = todayWeatherIcon;

このコードは、天気情報を表すJSON形式のテキストデータから、天気アイコンのURLを取り出すためのものです。

1行目では、入力として与えられた文字列のデータ(result)を、JSON形式として解析するためのJsonDocument型の変数documentを作成します。

2行目では、このJSON形式のデータのルート要素から、プロパティ名が「url」であるものを取り出し、その文字列値をtodayWeatherIconという変数に代入します。

3行目では、取り出した天気アイコンのURLを、画像表示用のコントロール(weatherIcon)のImageLocationプロパティに設定します。これにより、天気アイコンが画面に表示されます。

url項目等の情報をクラスで定義しておく

// 天気情報からアイコンのURLを取り出す
WeatherInfo weatherInfo = JsonSerializer.Deserialize<WeatherInfo>(result);
string todayWeatherIcon = weatherInfo.url;
weatherIcon.ImageLocation = todayWeatherIcon;

このコードは、天気情報からアイコンのURLを取り出す処理を行っています。

  • WeatherInfoオブジェクトを生成し、JSON形式のデータをデシリアル化して代入します。
  • WeatherInfoオブジェクトから、アイコンのURLを取り出し、todayWeatherIconという変数に代入します。
  • weatherIconオブジェクトのImageLocationプロパティにtodayWeatherIcon変数を代入し、アイコン画像の表示先を指定します。
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; }
    public string url { get; set; }
}

public class Location
{
    public string longitude { get; set; }
    public string latitude { get; set; }
}

全体のコード

//using Newtonsoft.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 WeatherChecker
{
    public partial class Form1 : Form
    {
        private Dictionary<string, string> cityNames;

        public Form1()
        {
            InitializeComponent();

            cityNames = new Dictionary<string, string>
            {
                { "東京都", "3" },
                { "大阪府", "1" },
                { "愛知県", "2" },
                { "福岡県", "10" }
            };

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

        private async void CitySelected(object sender, EventArgs e)
        {
            try
            {
                // 天気情報サービスにアクセスする
                string cityCode = cityNames[areaBox.Text];
                string url = $"WeatherURL?city={cityCode}";

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

                    // 天気情報からアイコンのURLを取り出す
                    WeatherInfo weatherInfo = JsonSerializer.Deserialize<WeatherInfo>(result);
                    string todayWeatherIcon = weatherInfo.url;
                    weatherIcon.ImageLocation = todayWeatherIcon;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void ExitMenuClicked(object sender, EventArgs e)
        {
            // フォームを閉じる
            this.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; }
            public string url { get; set; }
        }

        public class Location
        {
            public string longitude { get; set; }
            public string latitude { get; set; }
        }
    }
}