為了方便使用特定元件,需要從List
Json.Net 預設將實作 IEnumerable 的類別視為陣列。雖然使用 [JsonObject] 屬性裝飾類別可以覆寫此行為,但它僅序列化物件屬性,而使清單未序列化。這是因為清單不能透過公共屬性訪問,而是透過 GetEnumerator() 方法存取。
要包含兩者,您可以使派生類別中的公共屬性可供列表訪問,如 @ 建議的那樣Konrad,或者創建一個自定義 JsonConverter 來序列化整個物件。以下是範例:
假設PagedResult
class PagedResult<T> : List<T> { public int PageSize { get; set; } public int PageIndex { get; set; } public int TotalItems { get; set; } public int TotalPages { get; set; } }
以下是建立自訂轉換器的方法:
class PagedResultConverter<T> : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(PagedResult<T>)); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { PagedResult<T> result = (PagedResult<T>)value; JObject jo = new JObject(); jo.Add("PageSize", result.PageSize); jo.Add("PageIndex", result.PageIndex); jo.Add("TotalItems", result.TotalItems); jo.Add("TotalPages", result.TotalPages); jo.Add("Items", JArray.FromObject(result.ToArray(), serializer)); jo.WriteTo(writer); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); PagedResult<T> result = new PagedResult<T>(); result.PageSize = (int)jo["PageSize"]; result.PageIndex = (int)jo["PageIndex"]; result.TotalItems = (int)jo["TotalItems"]; result.TotalPages = (int)jo["TotalPages"]; result.AddRange(jo["Items"].ToObject<T[]>(serializer)); return result; } }
(請請注意,使用此方法不需要[JsonObject] 和[JsonProperty],因為需要了解序列化的內容在轉換器類別中進行編碼。
以上是如何使用 Json.NET 序列化具有附加成員的列表派生類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!