无需类型信息使用JSON.NET反序列化多态JSON类
Json.NET是一个功能强大的.NET JSON序列化和反序列化库。但是,当序列化数据中没有类型信息时,反序列化多态JSON可能具有挑战性。
问题:缺少类型信息
多态性允许多个类继承自一个公共基类。当反序列化表示多态对象的JSON数据时,如果没有类型信息,很难确定应该实例化哪个类。
例如,考虑以下JSON数据,它表示Gallery Image或Gallery Album类:
<code class="language-json">{ "id": "OUHDm", "title": "My most recent drawing. Spent over 100 hours.", "is_album": false }</code>
"is_album"属性区分这两个类。Gallery Images的"is_album"设置为false,而Gallery Albums设置为true。
解决方案:自定义JsonConverter
要反序列化这种多态JSON,您可以创建一个自定义JsonConverter来处理对象实例化。转换器检查"is_album"属性并创建相应的类实例。
这是一个名为GalleryItemConverter的示例转换器:
<code class="language-csharp">public class GalleryItemConverter : JsonConverter { // 指定转换器可以转换GalleryItem及其派生类 public override bool CanConvert(Type objectType) => typeof(GalleryItem).IsAssignableFrom(objectType); public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 将JSON读取为JObject 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(); // 从JSON数据填充项目属性 serializer.Populate(jo.CreateReader(), item); return item; } }</code>
与JSON.NET反序列化的用法
要使用转换器,请将其作为参数包含在默认JSON.NET反序列化器中,如下所示:
<code class="language-csharp">var items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter());</code>
示例输出
使用提供的JSON数据和自定义转换器,您可以获得反序列化的GalleryItem对象:
<code class="language-csharp">// Gallery Image Console.WriteLine("ID: {0}, Title: {1}, Link: {2}", items[0].id, items[0].title, items[0].link); // Gallery Album Console.WriteLine("ID: {0}, Title: {1}, Link: {2}, Images: {3}", items[1].id, items[1].title, items[1].link, items[1].images.Count);</code>
以上是如何使用JSON.NET进行类型信息的情况下进行序列化多态性JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!