2016-09-28 45 views
2

我用下面的我的Web API項目的Startup.cs到JSON序列化枚舉成字符串:選擇性地使用默認的JSON轉換器

// Configure JSON Serialization 
var jsonSerializationSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; 
jsonSerializationSettings.Formatting = Newtonsoft.Json.Formatting.None; 
jsonSerializationSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); 

這是爲了避免裝飾每一個枚舉屬性與[JsonConverter(typeof(StringEnumConverter))]

現在,如何我是否可以選擇退出一些枚舉屬性的全局序列化設置,並使用轉換爲整數的默認序列化程序?

+0

理想情況下,您只應修飾所需的「屬性」而不是全局設置 –

+0

您是否想要退出特定屬性或特定枚舉? – dbc

+0

@dcb對於特定的屬性,可能通過使用屬性。 – orad

回答

1

你可以虛擬轉換器加到什麼也不做有問題的性質:

public class NoConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     // Note - not called when attached directly via [JsonConverter(typeof(NoConverter))] 
     throw new NotImplementedException(); 
    } 

    public override bool CanRead { get { return false; } } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanWrite { get { return false; } } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

然後將其連接到使用[JsonConverter(typeof(NoConverter))]財產。這樣做後,JsonConverter屬性的轉換器取代了全局指定的轉換器,但由於CanReadCanWrite都返回false,因此不執行轉換。對於枚舉集合,可以使用[JsonProperty(ItemConverterType = typeof(NoConverter))]

舉例來說,如果你定義的類型:

public enum Foo { A, B, C } 

public class RootObject 
{ 
    [JsonConverter(typeof(NoConverter))] 
    public Foo FooAsInteger { get; set; } 

    public Foo FooAsString { get; set; } 
} 

然後

var root = new RootObject { FooAsInteger = Foo.B, FooAsString = Foo.B }; 

var json = JsonConvert.SerializeObject(root, Formatting.Indented, new StringEnumConverter()); 

Console.WriteLine(json); 

產生輸出

{ 
    "FooAsInteger": 1, 
    "FooAsString": "B" 
} 

樣品fiddle