インスタンスをファイルに保存、読み出す方法(JSONフォーマット編:NewtonSoftのJSONを使う)
自作クラスのインスタンスなどを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
}
ディスカッション
コメント一覧
まだ、コメントがありません