使用自定義 JSON.NET 轉換器反序列化多態 JSON 數據
自定義 JSON.NET 轉換器提供了一種強大的機制來定制序列化和反序列化過程。它允許開發人員擴展 JSON.NET 的功能,以處理更複雜的數據類型或場景。
一種這樣的場景出現在處理多態性時,其中不同的類型繼承自基類。考慮以下示例:
public class Person { public string FirstName { get; set; } public string LastName { get; set; } } public class Employee : Person { public string Department { get; set; } public string JobTitle { get; set; } } public class Artist : Person { public string Skill { get; set; } }
現在,假設我們有一個 Person 對象列表的 JSON 表示,包括 Employee 和 Artist 的實例。
[ { "Department": "Department1", "JobTitle": "JobTitle1", "FirstName": "FirstName1", "LastName": "LastName1" }, { "Department": "Department2", "JobTitle": "JobTitle2", "FirstName": "FirstName2", "LastName": "LastName2" }, { "Skill": "Painter", "FirstName": "FirstName3", "LastName": "LastName3" } ]
我們如何將此 JSON 反序列化為 List<Person>
,同時正確識別每個人的具體類型?
自定義轉換器解決方案
標準的 CustomCreationConverter
沒有提供一種基於 JSON 內容確定正確類型的方法。但是,我們可以通過重寫 ReadJson
方法並引入一個新的抽象 Create
方法(該方法接受一個 JObject
)來創建我們自己的自定義轉換器:
public abstract class JsonCreationConverter<T> : JsonConverter { protected abstract T Create(Type objectType, JObject jObject); 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; } }
在我們的特定場景中,我們創建了一個擴展 JsonCreationConverter<Person>
的 PersonConverter
:
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; } }
使用此自定義轉換器,我們可以反序列化 JSON 字符串:
string json = "[...]"; // 此处应替换为实际的JSON字符串 List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());
PersonConverter
將分析 JSON 內容,確定每個人的正確類型,並相應地創建 Employee
、Artist
或 Person
的實例。這允許無縫反序列化多態數據結構。
以上是如何使用自定義JSON.NET轉換器進行多態性JSON數據進行序列化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!