無需類型信息使用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中文網其他相關文章!