首页 >后端开发 >C++ >如何处理枚举值不匹配的 JSON 反序列化错误?

如何处理枚举值不匹配的 JSON 反序列化错误?

Linda Hamilton
Linda Hamilton原创
2024-12-31 17:20:12178浏览

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