本指南旨在解决使用自定义JsonConverter将多态数据反序列化为基类列表的难题。在本例中,我们有一个基类Person和子类Employee和Artist,每个子类都有其独特的属性。
标准的CustomCreationConverter不足以完成此任务,因为它无法根据JSON对象分析确定正确的类型。相反,我们需要:
ReadJson方法将:
Create方法将:
考虑以下JSON:
<code>[{ "Department": "Department1", "JobTitle": "JobTitle1", "FirstName": "FirstName1", "LastName": "LastName1" },{ "Department": "Department2", "JobTitle": "JobTitle2", "FirstName": "FirstName2", "LastName": "LastName2" }, {"Skill": "Painter", "FirstName": "FirstName3", "LastName": "LastName3" }]</code>
<code class="language-csharp">string json = "[...]"; List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());</code>
<code class="language-csharp">public class PersonConverter : JsonCreationConverter<Person> { protected override Person Create(Type objectType, JObject jObject) { if (FieldExists("Skill", jObject)) { return new Artist(); } else if (FieldExists("Department", jObject)) { return new Employee(); } else { return new Person(); } } private bool FieldExists(string fieldName, JObject jObject) { return jObject[fieldName] != null; } } public abstract class JsonCreationConverter<T> : JsonConverter { protected abstract T Create(Type objectType, JObject jObject); public override bool CanConvert(Type objectType) => typeof(T).IsAssignableFrom(objectType); public override bool CanWrite => false; public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jObject = JObject.Load(reader); T target = Create(objectType, jObject); serializer.Populate(jObject.CreateReader(), target); return target; } }</code>
以上是如何使用自定义JSONCONVERTER将多态性JSON数据列为基础类列表?的详细内容。更多信息请关注PHP中文网其他相关文章!