セージ の メモ書き

メモこそ命の恩人だ

Visual Studio - JSON → クラスの自動生成

JSON → クラスの自動生成

  • 手順

    • JSON の文字列データをクリップボードにコピー。
    • C# のファイル (***.cs) を表示。
    • 編集→"JSON をクラスとして貼り付ける"

  • 環境

  • 使用例
    • WEB API で取得した JSON からクラスを生成。
  • 注意
    • JSON 文字列では、元のデータ型を判定できない。
    • そのため、自動生成したクラスと元のクラスが完全に一致するとは限らない。
    • クラスのたたき台として利用すること。

以下のクラスで試してみる。
リアライザーは JSON.NET を使用する。

public class SampleClass1
{
    public bool BoolValue { get; set; }

    public byte ByteValue { get; set; }

    public int IntValue { get; set; }
    public uint UintValue { get; set; }

    public float FloatValue { get; set; }
    public double DoubleValue { get; set; }

    public char CharValue { get; set; }
    public string StringValue { get; set; }

    public SampleClass2 Sample2 { get; set; }

    public IEnumerable<SampleClass2> Sample2List { get; set; }
    public IDictionary<int, SampleClass2> Sample2Dic { get; set; }
}

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

まず、お試し用の JSON を生成する。

var sample = new SampleClass1()
{
    BoolValue = true,
    ByteValue = 10,
    IntValue = 11,
    UintValue = 12,
    FloatValue = (float)3.14,
    DoubleValue = 3.15,
    CharValue = 'a',
    StringValue = "Test",
    Sample2 = new SampleClass2()
    {
        Value1 = 1,
        Value2 = 2,
    },
    Sample2List = new List<SampleClass2>()
    {
        new SampleClass2() { Value1 = 10, Value2 = 20 },
        new SampleClass2() { Value1 = 30, Value2 = 40 },
    },
    Sample2Dic = new Dictionary<int, SampleClass2>()
    {
        [1] = new SampleClass2() { Value1 = 10, Value2 = 20 },
        [2] = new SampleClass2() { Value1 = 30, Value2 = 40 },
    },
};

var serializedInfo = JsonConvert.SerializeObject(sample);
Debug.WriteLine(serializedInfo);

{"BoolValue":true,"ByteValue":10,"IntValue":11,"UintValue":12,"FloatValue":3.14,"DoubleValue":3.15,"CharValue":"a","StringValue":"Test","Sample2":{"Value1":1,"Value2":2},"Sample2List":[{"Value1":10,"Value2":20},{"Value1":30,"Value2":40}],"Sample2Dic":{"1":{"Value1":10,"Value2":20},"2":{"Value1":30,"Value2":40}}}

生成した JSON 文字列をクリップボードにコピーし、クラスとして貼り付ける。

public class Rootobject
{
    public bool BoolValue { get; set; }
    public int ByteValue { get; set; }
    public int IntValue { get; set; }
    public int UintValue { get; set; }
    public float FloatValue { get; set; }
    public float DoubleValue { get; set; }
    public string CharValue { get; set; }
    public string StringValue { get; set; }
    public Sample2 Sample2 { get; set; }
    public Sample2list[] Sample2List { get; set; }
    public Sample2dic Sample2Dic { get; set; }
}

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

public class Sample2dic
{
    public _1 _1 { get; set; }
    public _2 _2 { get; set; }
}

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

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

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

クラスを自動生成できた。デシリアライズできるレベルになってる。
ただ、この機能で元のデータ型への復元は難しい。テンプレートとして扱うのが良さそう。

元のデータ型との差異

元のデータ型 自動生成後のデータ型
SampleClass1 Rootobject
byte、uint int
double float
char string
IEnumerable Sample2list[]
IDictionary<int, SampleClass2> Sample2dic


自動生成後のデータ型でデシリアライズできるか試す。

// ...
var serializedInfo = JsonConvert.SerializeObject(sample);
Debug.WriteLine(serializedInfo);

// 前述のコードに以下を追記。

var deserializedInfo = JsonConvert.DeserializeObject<Rootobject>(serializedInfo);

シリアライズできることを確認。
Dictionary 以外は元のデータが格納されたことを確認。



以上