Untuk memudahkan kerja dengan komponen tertentu, adalah perlu untuk mendapatkan kelas baharu, PagedResult
Json.Net memperlakukan kelas yang melaksanakan IEnumerable sebagai tatasusunan secara lalai. Semasa menghias kelas dengan atribut [JsonObject] boleh mengatasi tingkah laku ini, ia hanya mensiri sifat objek, meninggalkan senarai tidak bersiri. Ini kerana senarai itu tidak boleh diakses melalui harta awam tetapi melalui kaedah GetEnumerator().
Untuk memasukkan kedua-duanya, anda boleh sama ada menjadikan harta awam dalam kelas terbitan anda boleh diakses oleh senarai, seperti yang dicadangkan oleh @ Konrad, atau buat JsonConverter tersuai untuk mensiri keseluruhan objek. Di bawah ialah contoh:
Andaikan 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; } }
Begini cara membuat penukar tersuai:
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; } }
(Perhatikan bahawa [JsonObject] dan [JsonProperty] tidak diperlukan dengan pendekatan ini, kerana pengetahuan tentang apa yang hendak disirikan dikodkan dalam kelas penukar.)
Di bawah ialah demonstrasi menggunakan penukar:
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); } }
Output:
{ "PageSize": 10, "PageIndex": 0, "TotalItems": 3, "TotalPages": 1, "Items": [ "foo", "bar", "baz" ] }
Atas ialah kandungan terperinci Bagaimana untuk Mensiri Kelas Terbitan Senarai dengan Ahli Tambahan Menggunakan Json.NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!