ホームページ >バックエンド開発 >C++ >列挙値が一致しない場合の JSON 逆シリアル化エラーを処理する方法は?

列挙値が一致しない場合の JSON 逆シリアル化エラーを処理する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-31 17:20:12188ブラウズ

How to Handle JSON Deserialization Errors with Mismatched Enum Values?

不明な列挙値による JSON 逆シリアル化エラーの克服

JSON のシリアル化と逆シリアル化を扱う場合、列挙値が異なる状況に遭遇することは珍しくありません。 JSON プロパティで指定された文字列値と一致しません。これにより、逆シリアル化中に例外がスローされ、アプリケーションのフローが中断される可能性があります。

この課題に対処するには、列挙値を柔軟に処理できるカスタム JsonConverter を利用できます。 TolerantEnumConverter はさまざまなシナリオを処理でき、ニーズに基づいて動作をカスタマイズできます。

コンバーターの機能:

  • JSON 値が enum 文字列と一致する場合
  • null 許容列挙型の場合、null が返されます。一致するものが見つからない場合。
  • 列挙型の値が「不明」の場合、他に一致するものが見つからない場合にその値が使用されます。
  • これらの条件のどちらも満たされない場合は、列挙型の最初の値が使用されます。 enum が返されます。

コード例:

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

使用法:

コンバーターを使用するには、列挙プロパティを [JsonConverter] 属性で装飾します:

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

TolerantEnumConverter を活用すると、アプリケーションが列挙値を適切に処理できるようになります。 JSON 逆シリアル化中の不一致を防止し、不要なエラーを防ぎ、データの整合性を維持します。

以上が列挙値が一致しない場合の JSON 逆シリアル化エラーを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。