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
Patricia Arquetteoriginal
2025-01-12 19:07:44279parcourir

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>

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>

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>

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!

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