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