【System.Text.Json】オブジェクトを保存/読み出す方法

ユーザーが入力したプレイヤーの名前をJSON形式で保存し、それをファイルに書き込んでから、再度そのファイルを読み取り、プレイヤーの名前を復元して表示するという処理を行なってみましょう

解説

保存したいオブジェクトを作成するためのクラス

class Player
{
    public string Name { get; set; }
}

このコードは、Player クラスを示しています。以下がその説明です:

  • Player クラスは、プレイヤーを表すためのデータ構造を定義しています。
  • クラスには1つのメンバーがあります: Name という名前のプロパティです。
  • Name プロパティは、プレイヤーの名前を表す文字列を取得または設定するための自動実装プロパティです。
  • 自動実装プロパティを使用することで、プロパティに対して明示的にフィールドを定義する必要がなく、簡潔な記述が可能です。裏では、コンパイラが必要なフィールドを生成し、それを制御するためのアクセサ (getter/setter) を提供します。
  • public アクセス修飾子が指定されているため、このプロパティは Player クラスの外部からアクセス可能です。

このような構造を持つ Player クラスを使うことで、プレイヤーの名前を保持するための便利なデータ構造を定義できます。

オブジェクト(インスタンス)の作成

Player player1 = new Player();
// 名前の登録
player1.Name = Console.ReadLine();

このコードは、Player クラスのインスタンスを作成し、そのインスタンスの Name プロパティにユーザーからの入力を格納するための処理を行っています。以下がその詳細です:

  1. Player クラスの新しいインスタンスを生成します。これは player1 という名前の変数に割り当てられます。
  2. Console.ReadLine() を使用して、ユーザーに名前を入力するように求めます。入力された名前は、プログラムの実行中にコンソールから受け取ったものです。
  3. 入力された名前は、player1Name プロパティに割り当てられます。

このコードの結果として、player1 インスタンスの Name プロパティには、ユーザーが入力した名前が格納されます。

オブジェクトからJSONフォーマットの文字列を作成

string json = JsonSerializer.Serialize(player1);

このコードは、player1 オブジェクトをJSON形式の文字列にシリアライズする処理を行っています。以下がその詳細です:

  1. JsonSerializer.Serialize() メソッドを使用して、player1 オブジェクトをJSON形式の文字列に変換します。
  2. 変換されたJSON形式の文字列は、json という名前の変数に格納されます。

ファイルに出力

File.WriteAllText("Player.json", json);

このコードは、C#で書かれたプログラムで、JSON形式の文字列をファイルに書き込む処理を行っています。以下がその詳細です:

  1. File.WriteAllText() メソッドを使用して、指定されたファイルに指定された文字列を書き込みます。
  2. "Player.json" は、書き込まれるファイルのパスとファイル名です。この場合、ファイル名は “Player.json" となります。".json" 拡張子はJSON形式のファイルを示します。
  3. json は、書き込まれるJSON形式の文字列です。これは、前の手順で JsonSerializer.Serialize() メソッドを使用して生成されたものです。

このコードの結果として、指定されたファイル(ここでは “Player.json")が作成され、その中にJSON形式の文字列が書き込まれます。これにより、JSON形式のデータを永続化し、後で読み取ることができます。

保存されたJSONフォーマットのファイルから読み取り

string ResumeJson = File.ReadAllText("Player.json");

このコードは、ファイルからJSON形式の文字列を読み込む処理を行っています。以下がその詳細です:

  1. File.ReadAllText() メソッドを使用して、指定されたファイルからテキストを読み込みます。
  2. "Player.json" は、読み込まれるファイルのパスとファイル名です。この場合、ファイル名は “Player.json" となります。".json" 拡張子はJSON形式のファイルを示します。
  3. 読み込まれたJSON形式の文字列は、ResumeJson という名前の変数に格納されます。

このコードの結果として、指定されたファイル(ここでは “Player.json")からJSON形式のデータが読み込まれ、その文字列が ResumeJson 変数に格納されます。これにより、後でこのJSON形式のデータを解析してプログラムで使用することができます。

JSONデータからオブジェクトを復元

Player loadedPlayer = JsonSerializer.Deserialize<Player>(ResumeJson);

このコードは、JSON形式の文字列を Player オブジェクトにデシリアライズする処理を行っています。以下がその詳細です:

  1. JsonSerializer.Deserialize<Player>() メソッドを使用して、JSON形式の文字列を Player クラスのオブジェクトにデシリアライズします。
  2. <Player> のジェネリック型引数は、デシリアライズするオブジェクトの型を示しています。この場合、Player クラスのオブジェクトをデシリアライズするために使用されます。
  3. ResumeJson 変数には、前のステップでファイルから読み込まれたJSON形式の文字列が格納されています。この文字列が Player オブジェクトにデシリアライズされます。
  4. デシリアライズされた Player オブジェクトは、loadedPlayer という名前の変数に割り当てられます。

このコードの結果として、JSON形式の文字列が Player クラスのオブジェクトにデシリアライズされ、それが loadedPlayer 変数に格納されます。これにより、プログラムでこのオブジェクトを使用して操作することができます。

復元の確認

// 保存されたオブジェクトの名前情報を表示
Console.Write("保存されたオブジェクトの名前:");
Console.WriteLine(loadedPlayer.Name);

このコードは、保存された Player オブジェクトの名前をコンソールに出力する処理を行っています。以下がその詳細です:

  1. Console.Write() メソッドを使用して、指定された文字列をコンソールに出力します。この場合、文字列 “保存されたオブジェクトの名前:" が出力されます。
  2. Console.WriteLine() メソッドを使用して、指定された文字列または変数の値をコンソールに出力します。この場合、loadedPlayer オブジェクトの Name プロパティの値が出力されます。
  3. Console.Write() は改行を行わないため、次に Console.WriteLine() を使用して改行を行います。

このコードの結果として、保存された Player オブジェクトの名前がコンソールに表示されます。これにより、プログラムのユーザーは、保存されたオブジェクトの名前を確認できます。

全体のコード

コード

using System.Text.Json;

Player player1 = new Player();
// 名前の登録
player1.Name = Console.ReadLine();

// オブジェクトからJSON文字列を作成
string json = JsonSerializer.Serialize(player1);
// ファイルに出力
File.WriteAllText("Player.json", json);
// 画面に出力
Console.WriteLine("Jsonフォーマットファイル:");
Console.WriteLine(json);

// 保存されたJSONを読み取り
string ResumeJson = File.ReadAllText("Player.json");
// JSONデータからオブジェクトを復元
Player loadedPlayer = JsonSerializer.Deserialize<Player>(ResumeJson);

// 保存されたオブジェクトの名前情報を表示
Console.Write("保存されたオブジェクトの名前:");
Console.WriteLine(loadedPlayer.Name);

class Player
{
    public string Name { get; set; }
}

このコードは、JSON形式のファイルにプレイヤーの情報を保存し、その後ファイルから情報を読み取り、再度プレイヤーのオブジェクトを作成する処理を行っています。以下がその詳細です:

  1. System.Text.Json 名前空間がインポートされています。これは、JSONデータのシリアライズおよびデシリアライズに使用されます。
  2. Player クラスが定義されています。このクラスには、プレイヤーの名前を表す Name プロパティが含まれています。
  3. プレイヤーの名前を入力し、その情報を持つ Player オブジェクトを作成します。
  4. JsonSerializer.Serialize() メソッドを使用して、player1 オブジェクトをJSON文字列に変換します。
  5. File.WriteAllText() メソッドを使用して、JSON文字列をファイルに書き込みます。
  6. 画面にメッセージを表示し、JSON形式の文字列を出力します。
  7. File.ReadAllText() メソッドを使用して、ファイルから保存されたJSON文字列を読み取ります。
  8. JsonSerializer.Deserialize() メソッドを使用して、JSON文字列から Player オブジェクトを再構築します。
  9. 最後に、再構築した Player オブジェクトの情報がコンソールに表示されます。

これにより、プレイヤーの情報をJSON形式のファイルに保存し、後で読み取ることができるようになります。

実行

入力

たろう

コンソール表示

Jsonフォーマットファイル:
{“Name":"\u305F\u308D\u3046″}
保存されたオブジェクトの名前:たろう

1行に表示されています
日本語はコードになっています

保存されたファイルの確認

日本語入力とインデントを配慮した全体コード

コード

using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;

Player player1 = new Player();
// 名前の登録
player1.Name = Console.ReadLine();


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

// オブジェクトからJSON文字列を作成(インデントフォーマットあり)
string json = JsonSerializer.Serialize(player1, options);
// ファイルに出力
File.WriteAllText("Player.json", json);
// 画面に出力
Console.WriteLine("Jsonフォーマットファイル:");
Console.WriteLine(json);

// 保存されたJSONを読み取り
string ResumeJson = File.ReadAllText("Player.json");
// JSONデータからオブジェクトを復元
Player loadedPlayer = JsonSerializer.Deserialize<Player>(ResumeJson);

// 保存されたオブジェクトの名前情報を表示
Console.Write("保存されたオブジェクトの名前:");
Console.WriteLine(loadedPlayer.Name);

class Player
{
    public string Name { get; set; }
}

このコードは、JSON形式のファイルにプレイヤーの情報を保存し、その後ファイルから情報を読み取り、再度プレイヤーのオブジェクトを作成する処理を行っています。以下がその詳細です:

  1. 最初に、System.Text.Encodings.WebSystem.Text.JsonSystem.Text.Unicodeの3つの名前空間がインポートされています。これらは、JSONデータのエンコードやデコードに必要な機能を提供します。
  2. Player クラスが定義されています。このクラスには、プレイヤーの名前を表す Name プロパティが含まれています。
  3. プレイヤーの情報を入力し、その情報を持つ Player オブジェクトを作成します。
  4. JsonSerializerOptions オブジェクトが作成され、JSONシリアライズ時のオプションが設定されます。これには、日本語文字のエンコード方法やインデントフォーマットの有無が含まれます。
  5. JsonSerializer.Serialize() メソッドを使用して、player1 オブジェクトをJSON文字列に変換します。この際に、先ほど定義したオプションが使用されます。
  6. File.WriteAllText() メソッドを使用して、JSON文字列をファイルに書き込みます。
  7. File.ReadAllText() メソッドを使用して、ファイルから保存されたJSON文字列を読み取ります。
  8. JsonSerializer.Deserialize() メソッドを使用して、JSON文字列から Player オブジェクトを再構築します。
  9. 最後に、再構築した Player オブジェクトの情報がコンソールに表示されます。

これにより、プレイヤーの情報をJSON形式のファイルに保存し、後で読み取ることができるようになります。

実行

入力

たろう

コンソール表示

Jsonフォーマットファイル:
{
“Name": “たろう"
}
保存されたオブジェクトの名前:たろう

コードはフォーマットにしたがってインデントと改行がなされています
日本語も表示されています

保存されたファイルの確認

保存ファイルだけでオブジェクトを再生できるか確認

読み取り部分以降のみで実行してみましょう

// 保存されたJSONを読み取り
using System.Text.Json;

string ResumeJson = File.ReadAllText("Player.json");
// JSONデータからオブジェクトを復元
Player loadedPlayer = JsonSerializer.Deserialize<Player>(ResumeJson);

// 保存されたオブジェクトの名前情報を表示
Console.Write("保存されたオブジェクトの名前:");
Console.WriteLine(loadedPlayer.Name);

class Player
{
    public string Name { get; set; }
}

コンソール表示

保存されたオブジェクトの名前:たろう

C#,JSON

Posted by hidepon