🤖

[C#]Jsonデシリアライズ時にはデフォルトコンストラクタが必要

2023/10/20に公開

自身のプロパティの値をjsonファイルに読み込みおよび書き込みできるクラスを作成したがコンストラクタのJSONデシリアライズ部分でエラーが発生した。

エラーが発生するコード

public class SettingParam
{
    public string FldPath { get; set; } = @"C:\";

    public SettingParameter(string filePath)
    {
        if (!File.Exists(filePath))
            return;

        var json = File.ReadAllText(filePath, new UTF8Encoding(true));
        var param = JsonSerializer.Deserialize<SettingParameter>(json);
        this.FldPath = param.FldPath;
    }

    public void Save(string filePath)
    {
        var json = JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true });
        using (var stream = new StreamWriter(filePath, false, new UTF8Encoding(true)))
        {
            stream.Write(json);
        }
    }
 }

発生したエラー

System.InvalidOperationException: 'Each parameter in the deserialization constructor on type' 

ChatGPTに聞いたところJSONデシリアライズを行う際は引数なしのコンストラクタ (デフォルトコンストラクタ) が必要とのこと。自身でコンストラクタを作成した場合、デフォルトコンストラクタが暗黙的に定義されないのでエラーが発生した。

エラーが発生しないコード

public class SettingParam
{
    public string FldPath { get; set; } = @"C:\";

    //デフォルトコンストラクタを追加
    public SettingParameter() { }

    public SettingParameter(string filePath)
    {
        if (!File.Exists(filePath))
            return;

        var json = File.ReadAllText(filePath, new UTF8Encoding(true));
        var param = JsonSerializer.Deserialize<SettingParameter>(json);
        this.FldPath = param.FldPath;
    }

    public void Save(string filePath)
    {
        var json = JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true });
        using (var stream = new StreamWriter(filePath, false, new UTF8Encoding(true)))
        {
            stream.Write(json);
        }
    }
 }

Discussion