Maison > développement back-end > C++ > Comment désérialiser les objets JSON polymorphes dans json.net sans informations de type explicite?

Comment désérialiser les objets JSON polymorphes dans json.net sans informations de type explicite?

Patricia Arquette
Libérer: 2025-02-02 12:06:12
original
903 Les gens l'ont consulté

How to Deserialize Polymorphic JSON Objects in Json.NET Without Explicit Type Information?

Pas besoin d'être des informations de type apparente, utilisez JSON.net Back-Sequentialized Polymorphic JSON Class

Les classes polymorphes circularisées (les objets peuvent appartenir à différentes sous-classes) sans que les informations de type soient difficiles. Cet article fournit une solution qui utilise JSONConverrer personnalisé pour gérer l'objet instancié dans cette scène, démontrant son implémentation et son application.

JSONConverr

personnalisé Afin de gérer le polymorphisme, vous pouvez créer un JSONConverrer personnalisé hérité de la classe de base JSONConverter. Ce convertisseur traitera la création d'objets en fonction de l'existence d'attributs spécifiques.

Considérez la structure de niveau de classe suivante:

JSONConverter implémente

public abstract class GalleryItem
{
    public string id { get; set; }
    public string title { get; set; }
    public string link { get; set; }
    public bool is_album { get; set; }
}

public class GalleryImage : GalleryItem
{
    // ...
}

public class GalleryAlbum : GalleryItem
{
    public int images_count { get; set; }
    public List<GalleryImage> images { get; set; }
}
Copier après la connexion

GalleryItemConverter Processing Object Instance et Deepertine Process:

<示> Utilisation dans le programme d'échantillon

public class GalleryItemConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(GalleryItem).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, 
        Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);

        // 如果 "is_album" 属性不存在,使用可空布尔值
        bool? isAlbum = (bool?)jo["is_album"];

        GalleryItem item;
        if (isAlbum.GetValueOrDefault())
        {
            item = new GalleryAlbum();
        }
        else
        {
            item = new GalleryImage();
        }

        serializer.Populate(jo.CreateReader(), item);

        return item;
    }
}
Copier après la connexion
Les procédures suivantes démontrent l'utilisation de GalleryItemConverter:

La sortie du programme est divisée en ces deux catégories avec succès en fonction de l'attribut "is_album".

Cette réponse révisée maintient l'image d'origine et utilise plus de langage de description tout en paraphrasant le contenu.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal