Heim >Backend-Entwicklung >C++ >Wie gehe ich mit JSON-Deserialisierungsfehlern mit nicht übereinstimmenden Enum-Werten um?

Wie gehe ich mit JSON-Deserialisierungsfehlern mit nicht übereinstimmenden Enum-Werten um?

Linda Hamilton
Linda HamiltonOriginal
2024-12-31 17:20:12188Durchsuche

How to Handle JSON Deserialization Errors with Mismatched Enum Values?

JSON-Deserialisierungsfehler mit unbekannten Enum-Werten überwinden

Beim Umgang mit JSON-Serialisierung und -Deserialisierung kommt es nicht selten vor, dass Ihre Enum-Werte auf Situationen stoßen stimmen nicht mit den in der JSON-Eigenschaft bereitgestellten Zeichenfolgenwerten überein. Dies kann dazu führen, dass während der Deserialisierung Ausnahmen ausgelöst werden, die den Ablauf Ihrer Anwendung stören.

Um dieser Herausforderung zu begegnen, können wir einen benutzerdefinierten JsonConverter mit flexibler Handhabung von Enum-Werten verwenden. Der TolerantEnumConverter kann verschiedene Szenarien verarbeiten, sodass Sie das Verhalten an Ihre Bedürfnisse anpassen können.

Konverterfunktionalität:

  • Wenn der JSON-Wert mit einer Enum-Zeichenfolge übereinstimmt oder eine Ganzzahl, es wird direkt verwendet.
  • Für nullfähige Aufzählungen wird null zurückgegeben, wenn keine Übereinstimmung vorliegt gefunden.
  • Wenn die Aufzählung einen „Unbekannten“ Wert hat, wird dieser verwendet, wenn keine andere Übereinstimmung gefunden wird.
  • Wenn keine dieser Bedingungen erfüllt ist, wird der erste Wert der Aufzählung zurückgegeben.

Code Beispiel:

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());
    }
}

Verwendung:

Um den Konverter zu verwenden, dekorieren Sie Ihre Enum-Eigenschaften mit dem Attribut [JsonConverter]:

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

Durch die Nutzung des TolerantEnumConverter können Sie sicherstellen, dass Ihre Anwendung währenddessen ordnungsgemäß mit Enum-Wert-Nichtübereinstimmungen umgeht JSON-Deserialisierung, um unnötige Fehler zu verhindern und die Datenintegrität aufrechtzuerhalten.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit JSON-Deserialisierungsfehlern mit nicht übereinstimmenden Enum-Werten um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn