Maison > développement back-end > C++ > Comment puis-je gérer les tableaux et objets JSON ambigus pendant la désérialisation ?

Comment puis-je gérer les tableaux et objets JSON ambigus pendant la désérialisation ?

Barbara Streisand
Libérer: 2025-01-12 19:01:43
original
541 Les gens l'ont consulté

How Can I Handle Ambiguous JSON Arrays and Objects During Deserialization?

Désérialisation JSON : gestion des tableaux et des objets ambigus

Lors du traitement des données JSON, vous rencontrez souvent des incohérences structurelles. Certaines propriétés peuvent être représentées sous forme de tableau dans une instance et sous forme d'objet dans une autre instance. Cela peut entraîner des problèmes lors de la désérialisation, en particulier lors de l'utilisation de classes de type sécurisé.

Question :

Considérez les données JSON suivantes renvoyées par Facebook :

  • Post mural (objet) :

      {
        "description": "",
        "permalink": "..."
      }
    Copier après la connexion
  • Post photo (tableau) :

      {
        "media": [
            {
                "href": "...",
                "src": "..."
            }
        ]
      }
    Copier après la connexion
  • Post mural mobile (objet) :

      {
        "name": null,
        "caption": null,
        "media": {}
      }
    Copier après la connexion

Dans le cas de publications murales mobiles, la propriété "media" est représentée comme un objet vide au lieu d'un tableau. Cette différence entraîne l'échec de la désérialisation lors de l'utilisation d'une classe qui attend un tableau d'objets « FacebookMedia ».

Solution : Convertisseur JSON personnalisé

Pour gérer cette situation, nous pouvons créer un convertisseur JSON personnalisé. Ce convertisseur examinera la structure JSON et renverra une liste ou null en fonction de la présence d'un tableau ou d'un objet.

public class FacebookMediaJsonConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
            return serializer.Deserialize<List<FacebookMedia>>(reader);
        else
            return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<FacebookMedia>);
    }
}
Copier après la connexion

Utilisation :

Pour utiliser un convertisseur, annotez les propriétés de votre classe avec l'attribut [JsonConverter] :

[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List<FacebookMedia> Media { get; set; }
Copier après la connexion

La désérialisation gérera désormais avec succès les tableaux et les objets de la propriété "Media".

Extensions pour un seul objet :

Si vous souhaitez recevoir une liste même avec un seul objet, vous pouvez étendre le convertisseur pour convertir un seul objet en liste.

public class SingleValueArrayConverter<T> : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object result;
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            result = new List<T> { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            result = serializer.Deserialize(reader, objectType);
        }
        else
        {
            throw new JsonSerializationException("Unexpected token type.");
        }
        return result;
    }

    // ... 转换器实现的其余部分 ...
}
Copier après la connexion

En utilisant un convertisseur JSON personnalisé, nous pouvons gérer les incohérences dans la structure JSON et garantir une désérialisation réussie.

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