本指南旨在解決使用自定義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中文網其他相關文章!