データを保存する方法について(.netオブジェクトのシリアライズ・デシリアライズ)
アプリケーションのデータを保存する際、JSONが使われることが多くなってきました。ファイルに保存するだけでなく、ネットワーク上での情報の受け渡しにも使われることがあります。
今回はJSONファイルの読み書きについて説明したいと思います。
JSONとは
「JavaScript ObjectNotation」の略です。近年ネットワークでJavaScriptが使用されることが多くなってきており、この形式がよく使われるようになってきました。
JSONが対応しているデータ型
JSONは以下の型に対応しています。
- 文字列型
- 数値
- bool型
- オブジェクト
- 配列
- null
.netで使用するには
通常ウィンドウ内の左側にあるソリューションエクスプローラの参照を右クリックし、右上の検索ボックスに「System.text」と入れると中央に「System.Text.Json」が表示されるので四角のボックスにチェックを入れOKを押します。
エラーが出る場合には同様に「System.Memory」も追加してください。
サンプル
今回シリアライズ・デシリアライズで使うクラス
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
シリアライズ
JSON を文字列またはファイルに書き込むには、JsonSerializer.Serialize メソッドを呼び出します。
次の例では、JSON ファイルを作成します。
using System.Text.Json;
namespace SerializeToFile
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string fileName = "WeatherForecast.json";
string jsonString = JsonSerializer.Serialize(weatherForecast);
File.WriteAllText(fileName, jsonString);
Console.WriteLine(File.ReadAllText(fileName));
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
デシリアライズ
JSONをデシリアライズするには、同じプロパティとフィールドを持ったクラスを作成する必要があります。その後、sonSerializer.Desirializeメソッドを呼び出します。クラスで表されていないJSONプロパティはすべて無視されます。
using System.Text.Json;
namespace DeserializeFromFile
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static void Main()
{
string fileName = "WeatherForecast.json";
string jsonString = File.ReadAllText(fileName);
WeatherForecast weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString)!;
Console.WriteLine($"Date: {weatherForecast.Date}");
Console.WriteLine($"TemperatureCelsius: {weatherForecast.TemperatureCelsius}");
Console.WriteLine($"Summary: {weatherForecast.Summary}");
}
}
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
Json.NETを使う方法もあります。
参考
System.Threading.Tasks.Extensionsの参照エラーが出た場合
C# で JSON をシリアル化する方法 - .NET
System.Text.Json 名前空間を使用して .NET で JSON にシリアル化する方法について説明します。 サンプル コードが含まれています。
System.Text.Json で JSON DOM を使用する方法 - .NET
JSON ドキュメント オブジェクト モデル (DOM) を使う方法について説明します。
C# を使用した JSON のシリアル化と逆シリアル化 - .NET
この概要では、.NET で JSON との間でシリアル化または逆シリアル化を行うための System.Text.Json 名前空間機能について説明します。
HTTPでのJSONの使い方(おまけ)
System.Net.Http.Json 名前空間
System.Text.Json を使用して自動的にシリアル化と逆シリアル化を実行する拡張メソッドを、HttpClient と HttpContent に提供します。