首頁 >後端開發 >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 值與枚舉字串相符或整數,則直接使用。
  • 對於可空枚舉,如果不符合則傳回 null找到。
  • 如果枚舉具有「未知」值,則在未找到其他匹配項時使用該值。
  • 如果這兩個條件都不滿足,則傳回枚舉的第一個值。

程式碼範例:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn