Maison > développement back-end > C++ > Comment sérialiser une classe dérivée d'une liste avec des membres supplémentaires à l'aide de Json.NET ?

Comment sérialiser une classe dérivée d'une liste avec des membres supplémentaires à l'aide de Json.NET ?

DDD
Libérer: 2025-01-07 13:07:41
original
432 Les gens l'ont consulté

How to Serialize a List-Derived Class with Additional Members Using Json.NET?

Comment sérialiser les membres d'une classe dérivée de la liste Utilisation de Json.net

Afin de faciliter le travail avec un composant spécifique, il est nécessaire de dériver une nouvelle classe, PagedResult, de List et inclure des membres supplémentaires. Cependant, lors de l'exécution du désérialiseur JSON, seule la liste est sérialisée. L'utilisation des attributs [JsonObject] et [JsonProperty] sur la classe dérivée sérialise uniquement les membres de la classe dérivée, à l'exclusion de la liste. Cet article explique comment sérialiser à la fois la liste et ses membres de classe dérivés.

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 existe sous la forme :

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; }
}
Copier après la connexion

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;
    }
}
Copier après la connexion

(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);
    }
}
Copier après la connexion

Sortie :

{
  "PageSize": 10,
  "PageIndex": 0,
  "TotalItems": 3,
  "TotalPages": 1,
  "Items": [
    "foo",
    "bar",
    "baz"
  ]
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal