2016-09-28 41 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