はじめに
本記事はNewtonsoft.jsonを使用した際に分かったデシリアライズ時の挙動についてわかったことをまとめた記事です。
わかったこと
Newtonsoft.jsonを使用してJson形式にシリアライズしたJsonオブジェクトをデシリアライズしたときに以下の挙動をしています。
①オブジェクトのコンストラクタに引数がある場合
コンストラクタの引数名がJSONオブジェクトの対応するプロパティ名と一致し(大文字と小文字を区別しない)、コンストラクタ内でプロパティの値の設定を行っていると、インスタンス生成時にプロパティが設定されます。以下のような場合です。
#region 構築
/// <summary>
/// コンストラクタ
/// </summary>
public MetaData(string key)
{
Key = key;
}
#endregion
#region プロパティ
/// <summary>
/// キー
/// </summary>
[JsonProperty]
public string Key { get; }
#endregion
では、デシリアライズ時に復元したい全てのプロパティ値をコンストラクタ引数に追加しなければならないのかというと、そうではありません。
② オブジェクトのコンストラクタに引数が無い場合
コンストラクタで引数を受け取りその引数を使用してプロパティ値の設定をしない場合は、インスタンスの生成後、オブジェクトのパブリックなプロパティまたは[JsonProperty]属性を付けたプロパティのセッターを使用して値を設定しようとします。
さいごに
どうやってデシリアライズされているのか仕組みを知らずに使っていたため、デバッグ中にうまくプロパティ値が復元できるプロパティとできないプロパティがあり混乱することがありましたので、本記事にまとめました。
皆様の参考になれば嬉しいです。
最後までお読みいただきありがとうございます。
参考サイト