PR

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

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

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

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

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

[C#] Dictionaryや匿名クラスをJSON文字列に変換する
こちらの記事ではクラスオブジェクトとJSONファイルの相互変換について書きました。 が、わざわざJSONの定義に合ったクラスを定義するのはめんどくさいということでDictionaryや匿名クラスをJSON文字列にしてしまおうという記事です。...
[C#] JSON文字列をDictionaryに変換する
こちらの記事ではクラスオブジェクトとJSONファイルの相互変換について書きました。 が、わざわざJSONの定義に合ったクラスを定義するのはめんどくさいということで、なんとかいい感じにDicitonaryとかにデシリアライズできないかという記...
スポンサーリンク

クラスオブジェクトを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文字列の内容をファイルに書き出しています。
ファイルの書き込みについてはこちらを見てください、

[C# File] テキストファイルの読み込みと書き込み
テキストファイルの読込・書込を行う方法のまとめです。読み書きどちらもSystem.IO.Fileクラスにあるメソッドを使い行うことができます。 テキストファイルの読込 読み込んだ内容を文字列型(string)で一気に受け取る方法と改行ごとに...
スポンサーリンク

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; }
}

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

スポンサーリンク

コピペでJSON用のクラス定義を作成

VisualStudioの「形式を選択して貼り付け」でJSON用のクラス定義を簡単に作成できるので紹介します。手順は定義を作りたいJSONをコピーして形式を選択して貼り付けをするだけです。

  • まずはJSONデータをコピーして・・・
{
    number : 122,
    text : "YasNote",
    on_off : false,
    ary_num1 : [1,2,3],
    ary_num2 : [1.23, 5.88],
    ary_str : ["a", "b", "c"],
    obj : {
        str : "aaaa"
    }
}
  • VisualStudioで貼り付けたいところにカーソルを合わせて・・・
  • メニュー「編集」⇒「形式を選択して貼り付け」⇒「JSONをクラスとして貼り付ける
  • こんな感じでクラスがぺたっとできる


C# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント