Maison > développement back-end > C++ > Comment désérialiser JSON polymorphe sans informations de type à l'aide de JSON.net?

Comment désérialiser JSON polymorphe sans informations de type à l'aide de JSON.net?

DDD
Libérer: 2025-02-02 11:56:10
original
147 Les gens l'ont consulté

How to Deserialize Polymorphic JSON Without Type Information Using JSON.NET?

Pas besoin d'informations de type pour utiliser JSON.net Back-Sequentialized Polymorphic JSON Class

json.net est une puissante bibliothèque de sérialisation et de désertiisation .net JSON. Cependant, lorsqu'il n'y a pas de type d'informations dans les données sérialisées, le polymorphisme à contre-courant JSON peut être difficile.

Question: manque d'informations de type

Le polymorphisme permet à plusieurs classes de hériter d'une classe de base publique. Lorsque la profondericularisation représente les données JSON de l'objet polymorphe, s'il n'y a pas de type d'informations, il est difficile de déterminer quelle classe doit être instanciée.

Par exemple, compte tenu des données JSON suivantes, cela indique que l'image de galerie ou la classe d'album de galerie:

"IS_ALBUM" Les attributs se distinguent. Le "IS_ALBUM" des images de galerie est défini sur False, et les albums de la galerie sont définis sur true.

<code class="language-json">{
    "id": "OUHDm",
    "title": "My most recent drawing. Spent over 100 hours.",
    "is_album": false
}</code>
Copier après la connexion
Solution: JSONConveter

Pour la dépendance de ce JSON polymorphe, vous pouvez créer un JSONConverrer personnalisé pour traiter l'instance d'objet. Le convertisseur vérifie la propriété "IS_ALBUM" et crée l'instance de classe correspondante. Il s'agit d'un convertisseur d'échantillon appelé GalleryItemConverter:

L'utilisation de la sérialisation arrière de JSON.net

<code class="language-csharp">public class GalleryItemConverter : JsonConverter
{
    // 指定转换器可以转换GalleryItem及其派生类
    public override bool CanConvert(Type objectType) => typeof(GalleryItem).IsAssignableFrom(objectType);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 将JSON读取为JObject
        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();

        // 从JSON数据填充项目属性
        serializer.Populate(jo.CreateReader(), item);

        return item;
    }
}</code>
Copier après la connexion
Pour utiliser le convertisseur, veuillez l'inclure en tant que paramètre dans le sérialiseur Backlatier JSON.NET par défaut, comme indiqué ci-dessous:

Exemple de sortie

En utilisant les données JSON et le convertisseur personnalisé fourni, vous pouvez obtenir l'objet GalleryItem déserté:
<code class="language-csharp">var items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter());</code>
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!

source:php.cn
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