Maison >développement back-end >C++ >Comment puis-je effectuer la désérialisation JSON polymorphe dans json.net sans informations de type?

Comment puis-je effectuer la désérialisation JSON polymorphe dans json.net sans informations de type?

Barbara Streisand
Barbara Streisandoriginal
2025-02-02 12:01:11411parcourir

How Can I Perform Polymorphic JSON Deserialization in Json.NET Without Type Information?

json.net sans type d'informations sans type d'informations.

La fonctionnalité puissante de JSON.NET permet aux données JSON polymorphes de retour à commande même sans informations de type. Ceci est particulièrement utile lors du traitement des sources de données de différents types de types de types de types, par exemple, l'API Imgur renvoie également la situation de l'image de la galerie et de l'album de galerie. Pour y parvenir, nous avons créé un JSONConverter personnalisé pour gérer le processus instancié. Tout d'abord, nous définissons notre classe de base GalleryItem et sa classe dérivée GalleryImage et Galleryalbum:

Ensuite, nous réalisons notre JsonConverter, GalleryItemConverter:

<code class="language-csharp">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; }
}</code>
Le convertisseur vérifie s'il existe une propriété "IS_ALBUM" pour déterminer le type à instanciation. Ensuite, il remplit les attributs de l'objet en fonction des données de l'objet JSON.

Afin de démontrer son utilisation, nous définissons un exemple de l'exemple de données fournies par l'analyse:
<code class="language-csharp">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)
    {
        // 解析包含数据的JSON对象
        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();

        // 使用JsonSerializer填充对象的属性
        serializer.Populate(jo.CreateReader(), item);

        return item;
    }

    // 对于我们的目的,不需要实现CanWrite和WriteJson
}</code>

La sortie du programme montre la dégradation réussie de l'image de la galerie et des objets de l'album de la galerie, et le remplissage précis de leurs attributs respectifs.

De cette manière, JSONConverrter personnalisé nous permet de traiter la sérialisation JSON polymorphe JSON sans informations de type explicite, afin que nous puissions collaborer de manière transparente avec différentes sources de données.
<code class="language-csharp">string json = @"
[
    {
        ""id"": ""OUHDm"",
        ""title"": ""My most recent drawing. Spent over 100 hours."",
        ""link"": ""http://i.imgur.com/OUHDm.jpg"",
        ""is_album"": false
    },
    {
        ""id"": ""lDRB2"",
        ""title"": ""Imgur Office"",
        ""link"": ""http://alanbox.imgur.com/a/lDRB2"",
        ""is_album"": true,
        ""images_count"": 3,
        ""images"": [
            {
                ""id"": ""24nLu"",
                ""link"": ""http://i.imgur.com/24nLu.jpg""
            },
            {
                ""id"": ""Ziz25"",
                ""link"": ""http://i.imgur.com/Ziz25.jpg""
            },
            {
                ""id"": ""9tzW6"",
                ""link"": ""http://i.imgur.com/9tzW6.jpg""
            }
        ]
    }
]";

List<GalleryItem> items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter());</code>

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:
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