ホームページ >バックエンド開発 >C++ >BaseType が Abstract の場合、Newtonsoft JSON.NET を使用して JSON を IEnumerable に逆シリアル化する方法は?

BaseType が Abstract の場合、Newtonsoft JSON.NET を使用して JSON を IEnumerable に逆シリアル化する方法は?

DDD
DDDオリジナル
2025-01-17 13:36:09951ブラウズ

How to Deserialize JSON into an IEnumerable with Newtonsoft JSON.NET when BaseType is Abstract?

Newtonsoft JSON.NET を使用して JSON を IEnumerable に逆シリアル化します

BaseType が抽象クラスの場合、JsonConvert.Deserialize を使用して JSON データを IEnumerable に逆シリアル化するのは困難な場合があります。

質問:

次の JSON について考えてみましょう:

<code>[
  {
    "$id": "1",
    "$type": "MyAssembly.ClassA, MyAssembly",
    "Email": "[email\u00a0protected]"
  },
  {
    "$id": "2",
    "$type": "MyAssembly.ClassB, MyAssembly",
    "Email": "[email\u00a0protected]"
  }
]</code>

と次の抽象基本クラスおよび派生クラス:

<code>public abstract class BaseClass
{
    public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}</code>

JSON を次のように逆シリアル化しようとすると:

<code>IEnumerable<基类> deserialized;</code>

JsonConvert.Deserialize>() を使用すると、BaseClass が抽象であるため、エラーが発生します。

解決策:

この問題を解決するには、JsonSerializerSettings の TypeNameHandling 設定を使用します。この設定を TypeNameHandling.All に設定すると、逆シリアル化された JSON に型情報が含まれます。

<code>JsonSerializerSettings settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};

string strJson = JsonConvert.SerializeObject(instance, settings);</code>

更新された JSON:

<code>{
  "$type": "System.Collections.Generic.List`1[[MyAssembly.BaseClass, MyAssembly]], mscorlib",
  "$values": [
    {
      "$id": "1",
      "$type": "MyAssembly.ClassA, MyAssembly",
      "Email": "[email\u00a0protected]",
    },
    {
      "$id": "2",
      "$type": "MyAssembly.ClassB, MyAssembly",
      "Email": "[email\u00a0protected]",
    }
  ]
}</code>

型情報を含めた後、逆シリアル化が正しく実行されるようになりました:

<code>IEnumerable<BaseClass> obj = JsonConvert.DeserializeObject<IEnumerable<BaseClass>>(strJson, settings);</code>

以上がBaseType が Abstract の場合、Newtonsoft JSON.NET を使用して JSON を IEnumerable に逆シリアル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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