Jsonデータの解析方法のいろいろ
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を抽出しています。
- JObject.Parseメソッドを使って、APIから取得した天気情報の文字列をJObject形式に変換します。この変換は、"JObject.Parse" メソッドを使用することによって行われます。
- JObjectの中から「url」というキーの値を抽出します。
- JValue型に変換(キャスト)します。
("JValue" 型は、JSON のプリミティブな値(文字列、数値、真偽値など)を表します) - そのValueプロパティからURLの実際の文字列を取り出します。
- 取り出した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; }
}
}
}
ディスカッション
コメント一覧
まだ、コメントがありません