2016-09-28 4 views
2

Ich verwende die folgenden in meinem Web-API-Projekts verwenden Startup.cs zu JSON-Serialisierung Aufzählungen in Strings:Selektiv Standard JSON Konverter

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

Dies ist jede Enum-Eigenschaft mit [JsonConverter(typeof(StringEnumConverter))]

nun zu vermeiden, die Dekoration, wie kann ich meine globale Serialisierungseinstellung für einige Enum-Eigenschaften selektiv deaktivieren und den Standard-Serializer verwenden, der in Ganzzahlen konvertiert?

+0

Idealerweise sollten Sie nur die erforderlichen Eigenschaften anstelle der globalen Einstellung dekorieren. –

+0

Möchten Sie bestimmte Eigenschaften oder bestimmte Enums deaktivieren? – dbc

+0

@dcb Für bestimmte Eigenschaften, wahrscheinlich mithilfe eines Attributs. – orad

Antwort

1

Sie könnten einen Dummy-Konverter auf die Eigenschaften in Frage hinzufügen, die nichts tut:

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(); 
    } 
} 

es mit [JsonConverter(typeof(NoConverter))] der Eigenschaft Dann befestigen. Wenn Sie dies getan haben, ersetzt der Konverter JsonConverter den global angegebenen Konverter, aber da CanRead und CanWrite beide falsch zurückgeben, wird keine Konvertierung durchgeführt. Für Sammlungen von Enums können Sie [JsonProperty(ItemConverterType = typeof(NoConverter))] verwenden.

Zum Beispiel, wenn Sie die Typen definieren:

public enum Foo { A, B, C } 

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

    public Foo FooAsString { get; set; } 
} 

Dann

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

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

Console.WriteLine(json); 

erzeugt die Ausgabe

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

Probe fiddle.