首頁 >後端開發 >C++ >當 BaseType 為 Abstract 時,如何使用 Newtonsoft JSON.NET 將 JSON 反序列化為 IEnumerable?

當 BaseType 為 Abstract 時,如何使用 Newtonsoft JSON.NET 將 JSON 反序列化為 IEnumerable?

DDD
DDD原創
2025-01-17 13:36:09950瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn