ホームページ >バックエンド開発 >C++ >型情報を保持しながら JSON.NET の派生型を逆シリアル化するにはどうすればよいですか?

型情報を保持しながら JSON.NET の派生型を逆シリアル化するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-21 18:46:14681ブラウズ

How Can I Deserialize Derived Types in JSON.NET While Preserving Type Information?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。