無需顯式類型信息,使用 Json.NET 反序列化多態 JSON 類
在沒有類型信息的情況下反序列化多態類(對象可以屬於不同的子類)可能具有挑戰性。本文提供了一種使用自定義 JsonConverter 來處理此場景中對象實例化的解決方案,演示了其實現和應用。
用於多態反序列化的自定義 JsonConverter
為了處理多態反序列化,可以創建一個從 JsonConverter 基類繼承的自定義 JsonConverter。此轉換器將根據特定屬性的存在來處理對象的創建。
考慮以下類層次結構:
<code class="language-csharp">public abstract class GalleryItem { public string id { get; set; } public string title { get; set; } public string link { get; set; } public bool is_album { get; set; } } public class GalleryImage : GalleryItem { // ... } public class GalleryAlbum : GalleryItem { public int images_count { get; set; } public List<GalleryImage> images { get; set; } }</code>
JsonConverter 實現
GalleryItemConverter 處理對象實例化和反序列化過程:
<code class="language-csharp">public class GalleryItemConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(GalleryItem).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); // 如果 "is_album" 属性不存在,使用可空布尔值 bool? isAlbum = (bool?)jo["is_album"]; GalleryItem item; if (isAlbum.GetValueOrDefault()) { item = new GalleryAlbum(); } else { item = new GalleryImage(); } serializer.Populate(jo.CreateReader(), item); return item; } }</code>
示例程序中的用法
以下程序演示了 GalleryItemConverter 的用法:
<code class="language-csharp">class Program { static void Main(string[] args) { string json = @" [ { ""id"": ""OUHDm"", ""title"": ""My most recent drawing. Spent over 100 hours."", ""link"": ""http://i.imgur.com/OUHDm.jpg"", ""is_album"": false }, { ""id"": ""lDRB2"", ""title"": ""Imgur Office"", ""link"": ""http://alanbox.imgur.com/a/lDRB2"", ""is_album"": true, ""images_count"": 3, ""images"": [ { ""id"": ""24nLu"", ""link"": ""http://i.imgur.com/24nLu.jpg"" }, { ""id"": ""Ziz25"", ""link"": ""http://i.imgur.com/Ziz25.jpg"" }, { ""id"": ""9tzW6"", ""link"": ""http://i.imgur.com/9tzW6.jpg"" } ] } ]"; List<GalleryItem> items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter()); } }</code>
程序輸出根據“is_album”屬性成功區分了這兩個類。
This revised response maintains the original image and uses more descriptive language while paraphrasing the content. It also corrects a minor typo ("galleryimage" should be "GalleryImage").
以上是如何在沒有明確類型信息的情況下在JSON.NET中進行多態性JSON對象?的詳細內容。更多資訊請關注PHP中文網其他相關文章!