首页 > 后端开发 > C++ > 如何在 JSON 反序列化过程中优雅地处理未知的枚举值?

如何在 JSON 反序列化过程中优雅地处理未知的枚举值?

Barbara Streisand
发布: 2025-01-01 11:02:09
原创
741 人浏览过

How to Gracefully Handle Unknown Enum Values During JSON Deserialization?

在 JSON 反序列化期间忽略未知的枚举值

将 JSON 数据反序列化为枚举时,可能会遇到 JSON 属性包含以下内容的情况与任何现有枚举值都不匹配的值。默认情况下,这可能会导致错误。

TolerantEnumConverter 来救援

要优雅地处理此问题,您可以使用名为 TolerantEnumConverter 的自定义 JsonConverter。此转换器通过定义一组规则提供了一种灵活的方法来处理未知枚举值:

  1. 如果 JSON 值与现有枚举值匹配,则使用它。
  2. 如果枚举是可空且 JSON 值为空,则将其设置为空。
  3. 如果枚举具有名为“Unknown”的值,则它是
  4. 否则,使用枚举的第一个值。

实现细节

TolerantEnumConverter 处理字符串和整数值在 JSON 中。它根据不区分大小写的字符串比较或枚举值集中是否存在来检查匹配项。

示例用法

要使用 TolerantEnumConverter,请使用以下命令注释您的枚举属性[JsonConverter(typeof(TolerantEnumConverter))] 属性。下面是一个示例:

[JsonConverter(typeof(TolerantEnumConverter))]
enum Status
{
    Ready = 1,
    Set = 2,
    Go = 3,
}
登录后复制

演示应用程序

以下演示应用程序演示了如何使用 TolerantEnumConverter 处理不可为空和可为空的情况枚举:

// Sample JSON data
string json = @"
{
    ""NonNullableStatusWithValidStringValue"" : ""Set"",
    ""NonNullableStatusWithInvalidStringValue"" : ""Blah"",
    ""NullableStatusWithValidStringValue"" : ""Go"",
    ""NullableStatusWithInvalidStringValue"" : ""Blah"",
}";

// Deserialize JSON data into Foo object
Foo foo = JsonConvert.DeserializeObject<Foo>(json, new JsonSerializerSettings
{
    Converters = { new TolerantEnumConverter() }
});

// Output the deserialized values
foreach (PropertyInfo prop in typeof(Foo).GetProperties())
{
    Console.WriteLine(prop.Name + ": " + (prop.GetValue(foo) ?? "(null)"));
}
登录后复制

输出:

NonNullableStatusWithValidStringValue: Set
NonNullableStatusWithInvalidStringValue: Ready
NullableStatusWithValidStringValue: Go
NullableStatusWithInvalidStringValue: (null)
登录后复制

结论

TolerantEnumConverter 提供了一种将 JSON 数据反序列化为枚举的便捷方法,而不会遇到错误对于未知值。它提供可定制的行为来满足您的特定需求。

以上是如何在 JSON 反序列化过程中优雅地处理未知的枚举值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板