C# 在Json.NET中,如何处理缺少的枚举值以选择另一个值
我想从我的枚举中删除一个枚举值。但是,当反序列化JSON时,如果找到已删除的枚举值,则应选择我选择的枚举值,而不是默认为C# 在Json.NET中,如何处理缺少的枚举值以选择另一个值,c#,json,enums,json.net,C#,Json,Enums,Json.net,我想从我的枚举中删除一个枚举值。但是,当反序列化JSON时,如果找到已删除的枚举值,则应选择我选择的枚举值,而不是默认为None,这是我的枚举中向后兼容的第一个值 例如: public enum ExampleHotkeyType { None, CaptureRegion, CaptureRegionWindow, CaptureRegionPolygon, CaptureRegionFreehand } 我想删除此枚举中的CaptureRegionW
None
,这是我的枚举中向后兼容的第一个值
例如:
public enum ExampleHotkeyType
{
None,
CaptureRegion,
CaptureRegionWindow,
CaptureRegionPolygon,
CaptureRegionFreehand
}
我想删除此枚举中的CaptureRegionWindow
,如果发现CaptureRegionWindow
则反序列化时,我想将其分配给CaptureRegion
。这样它就不会默认为None
我搜索过,也许我可以将CaptureRegion
enum值设置为具有多个名称作为属性,但找不到这样的内容
处理此问题的最佳方法是什么,这样我的用户设置就不会重置
注意:序列化/反序列化时我正在使用StringEnumConverter。继承StringEnumConverter允许我对其进行完全控制:
public class ExampleHotkeyTypeEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
{
string enumText = reader.Value.ToString();
if (!string.IsNullOrEmpty(enumText) && enumText.Equals("CaptureRegionWindow"))
{
return ExampleHotkeyType.CaptureRegion;
}
}
return base.ReadJson(reader, objectType, existingValue, serializer);
}
}
[JsonConverter(typeof(ExampleHotkeyTypeEnumConverter))]
public enum ExampleHotkeyType
{
None,
CaptureRegion,
CaptureRegionWindow,
CaptureRegionPolygon,
CaptureRegionFreehand
}
如果要保留现有枚举值,则可以改用此枚举转换器:
public class SafeStringEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
try
{
return base.ReadJson(reader, objectType, existingValue, serializer);
}
catch (JsonSerializationException)
{
return existingValue;
}
}
}
作为一种通用解决方案,我建议创建类似于.NET
EnumMember
的属性,该属性将接受多个值,然后在反序列化阶段使用它-这样我们可以支持任意枚举。下面是支持EnumMember
属性的转换器。