2016-06-13 4 views
3

Ich versuche, eine Liste von Objekten zu JSON mit Newtonsoft JsonConvert zu serialisieren. Meine Marker-Klasse enthält eine Enumeration und ich versuche, sie in eine camelCase-Zeichenfolge zu serialisieren. Basierend auf andere Fragen Stackoverflow, Ich versuche, die StringEnumConverter zu verwenden:Wie kann ich Eigenschaften an einen StringEnumConverter in einem JsonConverterAttribute übergeben

public enum MarkerType 
{ 
    None = 0, 
    Bookmark = 1, 
    Highlight = 2 
} 

public class Marker 
{ 
    [JsonConverter(typeof(StringEnumConverter)] 
    public MarkerType MarkerType { get; set; } 
} 

Diese teilweise funktioniert, aber meine MarkerType String ist Pascal, wenn ich rufe:

var json = JsonConvert.SerializeObject(markers, Formatting.None); 

Ergebnis:

{ 
    ..., 
    "MarkerType":"Bookmark" 
} 

Was ich wirklich suche ist:

Die StringEnumConverter docs Erwähnung eine CamelCaseText Eigenschaft, aber ich bin mir nicht sicher, wie man das mit der JsonConverterAttribute übergeben. Der folgende Code schlägt fehl:

[JsonConverter(typeof(StringEnumConverter), new object[] { "camelCaseText" }] 

Wie gebe ich die CamelCaseText Eigenschaft für die StringEnumConverter in einem JsonConverterAttribute?

Antwort

7

JsonConverterAttribute hat zwei Konstruktoren, von denen einer eine Parameterliste annimmt (Object[]). Dies entspricht dem Konstruktor des Typs.

Da man von StringEnumConverter's constructors für camelCaseText einen boolean nimmt, brauchen Sie nur diese Zeile in dem Attribut weitergeben müssen:

[JsonConverter(typeof(StringEnumConverter), new object[] { true }] 
public MarkerType MarkerType { get; set; } 

Beachten Sie, dass dies nur für Konstrukteure beschränkt ist; Es gibt keine Möglichkeit AllowIntegerValues auf StringEnumConverter mit der JsonConverterAttribute-Syntax festzulegen, da der einzige nicht standardmäßige Konstruktor nur einen Parameter für camelCaseText akzeptiert.