【フォームアプリ】【System.Text.Json】オブジェクトのデータを保存する方法

2024年3月4日

シリアライズとデシリアライズ

シリアライズ

シリアライズとは、複数の並列データを直列化して送信すること。
具体的には、メモリ上に存在する情報を、ファイルとして保存したり、ネットワークで送受信したりできるように変換すること。オブジェクト(インスタンス)を保存できるようにテキスト(JSONなど)やバイナリにデータ化すること

デシリアライズ

既にファイルとして存在しているデータや、一旦シリアライズされたデータがネットワークから送られてきた際に、プログラムで扱えるようにする作業。オブジェクト(インスタンス)を復元する

サンプルの作成

次のような商品クラスを作成します

プロパティしか対応していないため、フィールド(public string Name;)はJson変換されません

// 商品
class Product
{
    // 商品名
    public string Name { get; set; }
    // 賞味期限
    public DateTime Expiry { get; set; }
    // 大きさの種類
    public string[] Sizes { get; set; }
}

クラスからインスタンスを作成し、データをセットしましょう

button1のクリックイベントでインスタンスを作成します。

private void button1_Click(object sender, EventArgs e)
{
    // 商品
    Product product = new Product();
    // 名称
    product.Name = "Apple";
    // 賞味期限
    product.Expiry = new DateTime(2020, 1, 28);
    // 大きさの種類
    product.Sizes = new string[] { "Small" };
}

インスタンスをシリアライズ化します

必要に応じて、usingを追加します。

// オブジェクトからJSON文字列を作成(インデントフォーマットあり)
string json = JsonSerializer.Serialize(product, options);

ファイルに書き出します

必要に応じて、usingを追加します。
ファイルに書き出されていることを確認します。

// ファイルに出力
File.WriteAllText(“product.json", json);

ファイルから読み込みます

button2のクリックイベントでファイルから読み出します。

private void button2_Click(object sender, EventArgs e)
{
    // 保存されたJSON文字列を読み取り
    string json = File.ReadAllText("product.json");
}

JSON文字列から、オブジェクトを復元します

// JSON文字列からオブジェクトを復元
Product product = JsonSerializer.Deserialize<Product>(json);

復元されたオブジェクトの表示確認

// オブジェクトの名前情報を表示
label1.Text = product.Name;

jsonファイルサンプル

{
    "Name": "Apple",
    "Expiry": "2020-01-28T00:00:00",
    "Sizes": [
    "Small"
    ]
}
Apple

全コード

System.Text.Jsonは、.NET Core 3.0以降で標準のNuGetパッケージとして提供されています。そのため、.NET Core 3.0以降のプロジェクトで利用する場合は、NuGetパッケージマネージャーを使用してインストールする必要はありません。ただし、.NET Frameworkプロジェクトで使用する場合は、NuGetパッケージマネージャーを介して手動でインストールする必要があります。

したがって、System.Text.JsonはNuGetパッケージとして提供されていますが、.NET Core 3.0以降のプロジェクトでは拡張する必要はありません。

using System;
using System.IO;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
using System.Windows.Forms;

namespace Poly
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        JsonSerializerOptions options = new JsonSerializerOptions
        {
            // 日本語が表示できるようにする
            Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
            // インデントフォーマットあり
            WriteIndented = true
        };

        private void button1_Click(object sender, EventArgs e)
        {
            // 商品
            Product product = new Product();
            // 名称
            product.Name = "Apple";
            // 賞味期限
            product.Expiry = new DateTime(2020, 1, 28);
            // 大きさの種類
            product.Sizes = new string[] { "Small" };

            string json = JsonSerializer.Serialize(product, options);

            File.WriteAllText("product.json", json);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string json = File.ReadAllText("product.json");

            Product product = JsonSerializer.Deserialize<Product>(json);

            label1.Text = product.Name;
        }
    }
}

// 商品
class Product
{
    // 商品名
    public string Name { get; set; }
    // 賞味期限
    public DateTime Expiry { get; set; }
    // 大きさの種類
    public string[] Sizes { get; set; }
}