Json.net 派生型の逆シリアル化
JSON データを処理する場合、基本派生クラスの関係に従うオブジェクトをシリアル化および逆シリアル化すると有利な場合があります。ただし、Json.net (Newtonsoft) では、派生型を効率的に処理するために特定の構成が必要です。
質問:
次の基本クラスと派生クラスについて考えてみましょう:
<code>public class Base { public string Name; } public class Derived : Base { public string Something; }</code>
基本クラス オブジェクトと派生クラス オブジェクトを含む JSON 文字列を List<Base>
に逆シリアル化しようとすると、基本クラス オブジェクトのみが取得されるため、派生型情報は失われます。
解決策:
派生型を正常に逆シリアル化するには、型名の処理を有効にする必要があります。これは、JsonSerializerSettings
オブジェクトを作成し、TypeNameHandling
プロパティを All
に設定することで実現できます。この設定オブジェクトをシリアル化および逆シリアル化操作に渡します:
<code>Base object1 = new Base() { Name = "Object1" }; Derived object2 = new Derived() { Something = "Some other thing" }; List<Base> inheritanceList = new List<Base>() { object1, object2 }; JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; string Serialized = JsonConvert.SerializeObject(inheritanceList, settings); List<Base> deserializedList = JsonConvert.DeserializeObject<List<Base>>(Serialized, settings);</code>
型名の処理を有効にすることで、Json.net は JSON 文字列に型情報を含めます。逆シリアル化中に、この情報を使用して派生オブジェクトを正しく再作成し、deserializedList
を設定します。
注: このメソッドを使用すると、シリアル化されたデータ内のすべてのオブジェクトの名前とリスト自体が公開されます。これが問題となる場合は、多態性関係を処理する別の方法を検討してください。
以上が型情報を保持しながら JSON.NET の派生型を逆シリアル化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。