Maison >développement back-end >C++ >Comment gérer les erreurs de désérialisation JSON avec des valeurs d'énumération incompatibles ?

Comment gérer les erreurs de désérialisation JSON avec des valeurs d'énumération incompatibles ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-31 17:20:12188parcourir

How to Handle JSON Deserialization Errors with Mismatched Enum Values?

Surmonter les erreurs de désérialisation JSON avec des valeurs d'énumération inconnues

Lorsque vous traitez la sérialisation et la désérialisation JSON, il n'est pas rare de rencontrer des situations où vos valeurs d'énumération ne correspondent pas aux valeurs de chaîne fournies dans la propriété JSON. Cela peut entraîner la levée d'exceptions lors de la désérialisation, perturbant le flux de votre application.

Pour relever ce défi, nous pouvons utiliser un JsonConverter personnalisé avec une gestion flexible des valeurs d'énumération. Le TolerantEnumConverter peut gérer divers scénarios, vous permettant de personnaliser le comportement en fonction de vos besoins.

Fonctionnalité du convertisseur :

  • Si la valeur JSON correspond à une chaîne d'énumération ou entier, il est utilisé directement.
  • Pour les énumérations nullables, null est renvoyé si aucune correspondance n'est trouvé.
  • Si l'énumération a une valeur « Inconnu », elle est utilisée si aucune autre correspondance n'est trouvée.
  • Si aucune de ces conditions n'est remplie, la première valeur de l'énumération est renvoyée.

Code Exemple :

class TolerantEnumConverter : JsonConverter
{
    // Handle deserialization for enum types
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Get the underlying type for nullable types
        Type enumType = IsNullableType(objectType) ? Nullable.GetUnderlyingType(objectType) : objectType;

        // Attempt to match the JSON value to an enum value
        string[] names = Enum.GetNames(enumType);
        string enumText = reader.Value.ToString();

        string match = names
            .Where(n => string.Equals(n, enumText, StringComparison.OrdinalIgnoreCase))
            .FirstOrDefault();

        if (match != null)
        {
            return Enum.Parse(enumType, match);
        }

        // Handle nullable types
        if (IsNullableType(objectType))
        {
            return null;
        }

        // Handle enums with an "Unknown" value
        string defaultName = names
            .Where(n => string.Equals(n, "Unknown", StringComparison.OrdinalIgnoreCase))
            .FirstOrDefault();

        return Enum.Parse(enumType, defaultName ?? names.First());
    }
}

Utilisation :

Pour utiliser le convertisseur, décorez vos propriétés d'énumération avec l'attribut [JsonConverter] :

[JsonConverter(typeof(TolerantEnumConverter))]
enum Status
{
    Ready = 1,
    Set = 2,
    Go = 3
}

En tirant parti de TolerantEnumConverter, vous pouvez vous assurer que votre application gère correctement les incompatibilités de valeurs d'énumération pendant JSON. désérialisation, évitant les erreurs inutiles et préservant l'intégrité des données.

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