インスタンスをファイルに保存、読み出す方法(JSONフォーマット編:NewtonSoftのJSONを使う)

2023年1月27日

自作クラスのインスタンスなどをJSON形式で保存、読み出しをします。

準備

サンプルクラスを作ります。

namespace LoadSaveSample
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
    class Player
    {
        public string Name;
        public int Hp;
    }
}

サンプルクラスのインスタンスを作ります。

注意)Mainメソッドの部分のみ表記しています

static void Main(string[] args)
{
    Player hero = new Player();
    hero.Name = "さいたま";
    hero.Hp = 1000;
}

保存

JSONフォーマットに変換

FromObjectメソッドにインスタンスを引数で渡し、JSONフォーマットに変換された文字列を取得します。

// ユーザー定義型 -> JSON オブジェクト -> 文字列
string jsonSave = JToken.FromObject(hero).ToString();

JTokenが参照できないエラーになりますので、次のいずれかで対応します。

  • コードの最初にusingを追加
using Newtonsoft.Json.Linq;
  • VisualStudioのインテリセンス補助で対応(開発環境の機能を駆使)

エラーが起こっている箇所にマウスをしばらく置いておくとヒントマークが出るので、手順に従って修復

NuGetパッケージの管理画面が表示されます。

コード表示に戻ります。

コードの最初にusinngが追加されたのを確認します。(結果は同じ)

using Newtonsoft.Json.Linq;

Fileクラスがエラーになる場合、同様に修復します。

コードの最初にusingが追加されたのを確認します。

using System.IO;

ファイルに保存

JSONフォーマットに変換された文字列をファイルに保存します。
WriteAllTextメソッドにファイル名と保存したいデータを引数で渡します。

// すべてのデータをテキストファイルに保存
File.WriteAllText("player.json", jsonSave);

実行ファイルがある場所にplayer.jsonファイルがあることを確認します。
通常、¥bin¥Debugの中

メモ帳で開き、次のようなデータが保存されていることを確認します。

{
  "Name": "さいたま",
  "Hp": 1000
}

読み出し

ファイルから読み出し

JSONフォーマットのデータをファイルから読み出して、文字列型の変数に代入します。

// すべてのデータを読み込んでjsonLoad変数(文字列型)に代入
string jsonLoad = File.ReadAllText("player.json");

文字列型データをPlayer型のインスタンスに変換(デシリアライズ)、代入します。

新規でPlayer型のインスタンスcopyHero変数を作成します。

// JSONフォーマットのデータをPlayer型でデシリアライズ。copyHeroに代入。
Player copyHero = JsonConvert.DeserializeObject<Player>(jsonLoad);

JsonConvertがエラーになるので同様に修正(using Newtonsoft.Jsonを追加)します。

確認

コンソール画面に結果を表示します。

// 最初に作成したインスタンスの表示
Console.WriteLine($"{ hero.Name} { hero.Hp}");
// ロードしたJSONデータから作成したインスタンスの表示
Console.WriteLine($"{ copyHero.Name} { copyHero.Hp}");
// プログラムの終了時にコンソールが閉じないようにする
Console.ReadLine();

ファイルから読み出したインスタンスを変更して、コンソール画面に結果を表示し、影響がないことを確認します。

// インスタンス同士で影響がないことを確認
copyHero.Name = "さいたまのコピー";
Console.WriteLine($"{ hero.Name} { hero.Hp}");
// ロードしたJSONデータから作成したインスタンスの表示
Console.WriteLine($"{ copyHero.Name} { copyHero.Hp}");
// プログラムの終了時にコンソールが閉じないようにする
Console.ReadKey();

すべてのコードについて

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.IO;

namespace LoadSaveSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Player hero = new Player();
            hero.Name = "さいたま";
            hero.Hp = 1000;

            // ユーザー定義型 -> JSON オブジェクト -> 文字列
            string jsonSave = JToken.FromObject(hero).ToString();
            // すべてのデータをテキストファイルに保存
            File.WriteAllText("player.json", jsonSave);

            // すべてのデータを読み込んでjsonLoad変数に代入
            string jsonLoad = File.ReadAllText("player.json");

            // JSONフォーマットのデータをPlayer型でデシリアライズ。copyHeroに代入。
            Player copyHero = JsonConvert.DeserializeObject<Player>(jsonLoad);

            // 最初に作成したインスタンスの表示
            Console.WriteLine($"{ hero.Name} { hero.Hp}");
            // ロードしたJSONデータから作成したインスタンスの表示
            Console.WriteLine($"{ copyHero.Name} { copyHero.Hp}");
            // プログラムの終了時にコンソールが閉じないようにする
            Console.ReadLine();
            // インスタンス同士で影響がないことを確認
            copyHero.Name = "さいたまのコピー";
            // 最初に作成したインスタンスの表示
            Console.WriteLine($"{ hero.Name} { hero.Hp}");
            // ロードしたJSONデータから作成したインスタンスの表示
            Console.WriteLine($"{ copyHero.Name} { copyHero.Hp}");
            // プログラムの終了時にコンソールが閉じないようにする
            Console.ReadKey();

        }
    }
    class Player
    {
        public string Name;
        public int Hp;
    }
}

JSONファイル

{
 "Name": "さいたま",
 "Hp": 1000
}

C#,JSON

Posted by hidepon