"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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?

Publié le 2025-02-06
Parcourir:715

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

json désérialisation: gérer les tableaux et objets ambigus

Lors du traitement des données JSON, vous rencontrez souvent une incohérence structurelle. Certaines propriétés peuvent être représentées comme des tableaux dans un cas et comme des objets dans un autre. Cela peut causer des problèmes pendant la désérialisation, en particulier lors de l'utilisation de classes de type type.

question:

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

  • wall poteaux (objet):

    ]
      {
        "description": "",
        "permalink": "..."
      }
  • Posts photo (array):

      {
        "media": [
            {
                "href": "...",
                "src": "..."
            }
        ]
      }
  • Publis de mur mobile (objet):

      {
        "name": null,
        "caption": null,
        "media": {}
      }

Dans le cas des messages muraux en mouvement, l'attribut "Media" est représenté comme un objet vide au lieu d'un tableau. Cette différence provoque l'échec de la désérialisation lors de l'utilisation d'une classe qui s'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 vérifiera 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>(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);
    }
}

usage:

Pour utiliser le convertisseur, utilisez [JSONConverter] Classe de commentaires d'attribut:

[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List Media { get; set; }

Maintenant, la désérialisation traitera avec succès le tableau et l'objet de l'attribut "Media".

Extensions pour les objets uniques:

Si vous voulez qu'une liste soit reçue même si un seul objet, vous pouvez étendre le convertisseur pour convertir un seul objet en liste.

public class SingleValueArrayConverter : 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 { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            result = serializer.Deserialize(reader, objectType);
        }
        else
        {
            throw new JsonSerializationException("Unexpected token type.");
        }
        return result;
    }

    // ... 转换器实现的其余部分 ...
}

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

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3