當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
解:
為了解決這個問題,請在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中文網其他相關文章!