为了方便使用特定组件,需要从 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],因为需要了解序列化的内容在转换器类中进行编码。)
下面是使用转换器:
class Program { static void Main(string[] args) { PagedResult<string> result = new PagedResult<string> { "foo", "bar", "baz" }; result.PageIndex = 0; result.PageSize = 10; result.TotalItems = 3; result.TotalPages = 1; JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Converters.Add(new PagedResultConverter<string>()); settings.Formatting = Formatting.Indented; string json = JsonConvert.SerializeObject(result, settings); Console.WriteLine(json); } }
输出:
{ "PageSize": 10, "PageIndex": 0, "TotalItems": 3, "TotalPages": 1, "Items": [ "foo", "bar", "baz" ] }
以上是如何使用 Json.NET 序列化具有附加成员的列表派生类?的详细内容。更多信息请关注PHP中文网其他相关文章!