当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中文网其他相关文章!