无需显式类型信息,使用 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中文网其他相关文章!