Maison >développement back-end >C++ >Comment puis-je désérialiser des tableaux et des objets JSON mixtes en C# à l'aide d'un JsonConverter personnalisé ?

Comment puis-je désérialiser des tableaux et des objets JSON mixtes en C# à l'aide d'un JsonConverter personnalisé ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 19:22:46569parcourir

How Can I Deserialize Mixed JSON Arrays and Objects in C# Using a Custom JsonConverter?

Désérialisation C# de tableaux et d'objets JSON mixtes

Cet article aborde le défi de la désérialisation des données JSON provenant de sources telles que Facebook, où la structure des données peut apparaître de manière incohérente sous la forme d'un tableau ou d'un objet. La désérialisation JSON.NET standard échoue souvent dans de telles situations.

La solution : un convertisseur Json personnalisé

La solution consiste à créer un convertisseur JSON.NET personnalisé. Ce convertisseur gère à la fois les formats de tableau et d'objet, garantissant une désérialisation cohérente. (Voir « Utilisation d'un JsonConverter personnalisé pour corriger les mauvais résultats JSON » pour une explication plus détaillée.)

Implémentation du convertisseur personnalisé

Le cœur de la solution est un convertisseur personnalisé qui renvoie une liste du type de cible, même si le JSON d'entrée est un objet unique.

  1. Attribut de propriété :

    La propriété de votre classe C# qui contiendra les données désérialisées doit être annotée avec le convertisseur personnalisé :

    <code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))]
    public List<OrderItem> Items;</code>
  2. La SingleValueArrayConverter Classe :

    Ce convertisseur personnalisé vérifie le type de jeton JSON et désérialise de manière appropriée :

    <code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException(); // Not implemented for this example
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.StartObject)
            {
                T instance = (T)serializer.Deserialize(reader, typeof(T));
                return new List<T> { instance };
            }
            else if (reader.TokenType == JsonToken.StartArray)
            {
                return serializer.Deserialize(reader, objectType);
            }
            return null; // Handle other token types as needed
        }
    
        public override bool CanConvert(Type objectType)
        {
            return true; // Or add specific type checking here for robustness
        }
    }</code>

Ce convertisseur garantit que, que l'entrée JSON soit un objet unique ou un tableau, la propriété C# résultante contiendra toujours un List<T>. Notez que la gestion des erreurs (par exemple, pour les types de jetons inattendus) devra peut-être être ajoutée pour une utilisation en production. Cette approche est particulièrement utile lorsqu'une liste constitue une structure de données appropriée pour les entrées JSON d'objet unique et de tableau. Des solutions alternatives peuvent être nécessaires dans les scénarios où une liste n'est pas appropriée.

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