[C#] クラスオブジェクトとJSON文字列の相互変換(シリアライズ、デシリアライズ)

JsonSerializerを使ってクラスオブジェクトをJSON文字列に変換する方法、
JSON文字列をクラスオブジェクトに変換する方法のサンプルです。

クラスオブジェクト ⇒ JSON文字列 をシリアライズ
JSON文字列 ⇒ クラスオブジェクト をデシリアライズ、と呼びます。

JsonSerializerを使うには、コードの先頭にusing System.Text.Json; を追加します。

いちいちクラスを定義するのはめんどくさいという方は、こちらの記事をどうぞ。

スポンサーリンク

クラスオブジェクトをJSON文字列に変換する(シリアライズ)

JsonSerializer.Serializeメソッドを使うと引数に指定したオブジェクトをJSON文字列に変換することが出来ます。
任意で第2引数にオプション(JsonSerializerOptions)を指定することができます。
JsonSerializerOptions.WriteIndentedプロパティをtrueにすると改行、インデントされたJSON文字列が返ってきます。

JSON文字列に変換することのできる型は、

  • 数値、文字列、ブール値(true、false)、DateTime型
  • Dictionary<string, object>、または、Dictionary<string, JsonElement>
  • 1次元配列、ジャグ配列(int[][] など)
  • 次の名前空間にあるコレクション
    • System.Collection
    • System.Collection.Generic
    • System.Collection.Immutable

などがあります。

下のサンプルではついでにJSON文字列をファイルに出力しています。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;

class Program
{
    public static void Main()
    {
        // Json文字列に変換するデータ
        var data = new SampleData { 
            Data1 = false,
            Data2 = 10,
            Data3 = 1.23,
            Data4 = "TestJson",
            Data5 = new int[] { 1, 2, 3, 4, 5 },
            Data6 = new List<string> { "a", "b", "c", "\"" },
            Data7 = new Dictionary<string, int> {
                { "key1", 100 }, {"Key2", 200 },
            },
            Data8 = new SampleData_Sub { 
                Value1 = 99,
                Value2 = 999,
            },
        };
        // オプションを付けずにJson文字列に変換
        var json_str = JsonSerializer.Serialize(data);
        Console.WriteLine("オプションなしで変換");
        Console.WriteLine(json_str);

        // 見やすくするためにインデントオプションを付けてJson文字列に変換
        var json_str_Indent = JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true });
        Console.WriteLine("オプションありで変換");
        Console.WriteLine(json_str_Indent);

        // Jsonファイルを出力する
        File.WriteAllText("sample.json", json_str_Indent);
    }
}

class SampleData
{
    public bool Data1 { get; set; }
    public int Data2 { get; set; }
    public double Data3 { get; set; }
    public string Data4 { get; set; }
    public int[] Data5 { get; set; }
    public List<string> Data6 { get; set; }
    public Dictionary<string, int> Data7 { get; set; }

    /*
     *  Jsonの項目名とクラスのプロパティ名に違う名前を付けるときに
     *  JsonPropertyName属性でJson項目名を指定する
     *  「using System.Text.Json.Serialization;」 が必要
     */
    [JsonPropertyName("ClassData")]
    public SampleData_Sub Data8 { get; set; }
}

class SampleData_Sub
{
    public int Value1 { get; set; }
    public int Value2 { get; set; }
}

こんな感じに変換されます。

オプションなしで変換
{"Data1":false,"Data2":10,"Data3":1.23,"Data4":"TestJson","Data5":[1,2,3,4,5],"Data6":["a","b","c","\u0022"],"Data7":{"key1":100,"Key2":200},"ClassData":{"Value1":99,"Value2":999}}
オプションありで変換
{
  "Data1": false,
  "Data2": 10,
  "Data3": 1.23,
  "Data4": "TestJson",
  "Data5": [
    1,
    2,
    3,
    4,
    5
  ],
  "Data6": [
    "a",
    "b",
    "c",
    "\u0022"
  ],
  "Data7": {
    "key1": 100,
    "Key2": 200
  },
  "ClassData": {
    "Value1": 99,
    "Value2": 999
  }
}

38行目でJSON文字列の内容をファイルに書き出しています。
ファイルの書き込みについてはこちらを見てください、

スポンサーリンク

JSON文字列をクラスオブジェクトに変換する(デシリアライズ)

上で書きだしたJSONファイルを読み込み、内容をクラスオブジェクトに変換してみます。

変換するにはJsonSerializer.Deserializeメソッドにjson文字列を指定します。また、メソッドの型引数<T>に変換するクラス型を指定します。

JSON文字列に該当するクラスの項目がない場合は、規定値(0やnullなど)が設定されます。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;

class Program
{
    public static void Main()
    {
        // JSON文字列をファイルから読み込む
        var json_str = File.ReadAllText("sample.json");

        // JSON文字列をクラスオブジェクトに変換
        var data = JsonSerializer.Deserialize<SampleData>(json_str);
    }
}

class SampleData
{
    public bool Data1 { get; set; }
    public int Data2 { get; set; }
    public double Data3 { get; set; }
    public string Data4 { get; set; }
    public int[] Data5 { get; set; }
    public List<string> Data6 { get; set; }
    public Dictionary<string, int> Data7 { get; set; }
    [JsonPropertyName("ClassData")]
    public SampleData_Sub Data8 { get; set; }
}

class SampleData_Sub
{
    public int Value1 { get; set; }
    public int Value2 { get; set; }
}

こんな感じで取り込まれました。


C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました