2016-01-04 60 views
3

我想從我的枚舉中刪除一個枚舉值。但是,如果反序列化JSON,如果刪除枚舉值找到,那麼它應該選擇我所選擇的枚舉值,而不是默認爲None,這是我的枚舉中的第一個值,用於向後兼容。在Json.NET中如何處理缺少的枚舉值來選擇另一個

例子:

public enum ExampleHotkeyType 
{ 
    None, 
    CaptureRegion, 
    CaptureRegionWindow, 
    CaptureRegionPolygon, 
    CaptureRegionFreehand 
} 

我想刪除此枚舉CaptureRegionWindow和反序列化,如果CaptureRegionWindow發現時,我希望它被分配到CaptureRegion代替。這樣它不會默認爲None

我搜索也許我可以設置CaptureRegion枚舉值有多個名稱作爲屬性,但無法找到這樣的事情。

什麼是最好的方式來處理這個問題,所以我的用戶設置不會重置?

注意:我在序列化/反序列化時使用了StringEnumConverter。

回答

1

繼承StringEnumConverter讓我對它有完全的控制:

internal 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 
} 
+1

作爲一個通用的解決方案,我建議建立類似的屬性和.NET'EnumMember'這將接受多個值,然後用它在反序列化階段 - 這樣我們可以支持任意的枚舉。這是支持'EnumMember'屬性的轉換器。 https://gist.github.com/gubenkoved/999eb73e227b7063a67a50401578c3a7 –