Afin de faciliter le travail avec un composant spécifique, il est nécessaire de dériver une nouvelle classe, PagedResult
Json.Net traite les classes implémentant IEnumerable comme des tableaux par défaut. Bien que décorer la classe avec un attribut [JsonObject] puisse remplacer ce comportement, cela sérialise uniquement les propriétés de l'objet, laissant la liste non sérialisée. En effet, la liste n'est pas accessible via une propriété publique mais via la méthode GetEnumerator().
Pour inclure les deux, vous pouvez soit rendre une propriété publique de votre classe dérivée accessible à la liste, comme suggéré par @ Konrad, ou créez un JsonConverter personnalisé pour sérialiser l'intégralité de l'objet. Vous trouverez ci-dessous un exemple :
En supposant que 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; } }
Voici comment créer un convertisseur personnalisé :
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; } }
(Notez que [JsonObject] et [JsonProperty] ne sont pas nécessaires avec cette approche, car la connaissance de ce qu'il faut sérialiser est codé dans la classe du convertisseur.)
Vous trouverez ci-dessous une démonstration utilisant le convertisseur :
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); } }
Sortie :
{ "PageSize": 10, "PageIndex": 0, "TotalItems": 3, "TotalPages": 1, "Items": [ "foo", "bar", "baz" ] }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!