默认情况下,Json.Net将把任何实现
IEnumerable为数组的类视为。您可以通过用
[JsonObject]属性装饰类来覆盖此行为,但是如您所见,只有对象属性会被序列化。该列表本身不会被序列化,因为它不是通过公共属性公开的(而是通过
GetEnumerator()方法公开的)。
如果两者都想要,则可以按照@Konrad的建议进行 *** 作,并在派生类上提供一个公共属性以显示列表,或者可以编写自定义
JsonConverter序列化整个对象。后一种方法的示例如下。
假设您的
PagedResult<T>课程如下所示:
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" ]}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)