Maison > développement back-end > C++ > Comment désérialiser JSON avec des tableaux et des objets facultatifs dans JSON.NET ?

Comment désérialiser JSON avec des tableaux et des objets facultatifs dans JSON.NET ?

Patricia Arquette
Libérer: 2025-01-12 19:07:44
original
275 Les gens l'ont consulté

How to Deserialize JSON with Optional Arrays and Objects in JSON.NET?

Gestion de la désérialisation des tableaux et objets facultatifs dans JSON.NET

Lorsque vous utilisez la bibliothèque JSON.NET pour traiter les données renvoyées par Facebook, vous pouvez rencontrer des changements dans la structure JSON. Certaines propriétés sont parfois représentées sous forme de tableaux et parfois sous forme d'objets. Cela peut entraîner des problèmes de désérialisation.

Question

Certaines publications Facebook peuvent renvoyer du JSON dans le format suivant, ce qui entraîne l'échec de la désérialisation :

<code class="language-json">"attachment": {
    "media":{},
    "name":"",
    "caption":"",
    "description":"",
    "properties":{},
    "icon":"http://www.facebook.com/images/icons/mobile_app.gif",
    "fb_object_type":""
},
"permalink":"http://www.facebook.com/1234"</code>
Copier après la connexion

Solution

Pour résoudre ce problème, vous pouvez utiliser la classe JsonConverter pour implémenter un convertisseur JSON personnalisé. Ce convertisseur gérera les tableaux et les structures d'objets de propriétés spécifiques.

Convertisseur JSON personnalisé

Le convertisseur personnalisé suivant SingleValueArrayConverter convertit un seul objet en liste, permettant aux propriétés d'être désérialisées correctement :

<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object retVal;
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            retVal = new List<T>() { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            retVal = serializer.Deserialize(reader, objectType);
        }
        else
        {
            retVal = null; // 处理其他情况,例如空值
        }
        return retVal;
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}</code>
Copier après la connexion

Utilisation

Pour utiliser un convertisseur personnalisé, annotez la propriété dans la classe cible avec l'attribut JsonConverter :

<code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))]
public List<OrderItem> Items { get; set; }</code>
Copier après la connexion

Cela permettra à JSON.NET de gérer les tableaux et les structures d'objets de Items propriétés, résolvant ainsi les problèmes de désérialisation. A noter l'ajout de get; set; et la manipulation des cas else pour le rendre plus robuste.

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