2016-03-24 1 views
3

Mit dem folgenden TestklasseSet Default für Farbe mit JSON.Net

public class Test { 
    [DefaultValue("Black")] 
    public Color ForeColor = Color.Black; 
} 

und die folgenden Serialisierungscode:

var test = new Test(); 
var json = JsonConvert.SerializeObject(test, Newtonsoft.Json.Formatting.None, 
    new JsonSerializerSettings { 
     NullValueHandling = NullValueHandling.Ignore, 
     DefaultValueHandling = DefaultValueHandling.Ignore 
}); 

ich

{"ForeColor":"Black"} 

Gibt es eine (einfache) Möglichkeit, dass eine Color-Eigenschaft nicht serialisiert wird, wenn sie mit einem angegebenen Standardwert übereinstimmt.

Antwort

3

Die in der DefaultValueAttribute gespeicherten Standardwerte sind typspezifisch. Wenn Sie also einen Standardwert von "Black" angeben, ist der Standardwert ein tatsächlicher String, obwohl der Eigenschaftstyp von einem anderen Typ ist.

Um mit anderen nicht einfachen Typen zu arbeiten, müssen Sie a special overload des Attributs verwenden und den Objekttyp und einen Zeichenfolgenwert angeben, der mit einem bekannten Typkonverter in den Zieltyp konvertiert werden kann.

Zum Glück hat die Color struct einen Typ Konverter registriert. So können Sie es wie folgt verwenden:

public class Test 
{ 
    [DefaultValue(typeof(Color), "Black")] 
    public Color ForeColor = Color.Black; 
} 

Und dann funktioniert es wie gewünscht:

var test = new Test(); 
var json = JsonConvert.SerializeObject(test, new JsonSerializerSettings { 
    DefaultValueHandling = DefaultValueHandling.Ignore 
}); 
Console.WriteLine(json); // {} 
+0

ich genau diesen Code lief und bekam { "ForeColor": "0, 0, 0, 255"} als Ausgang, irgendwelche Ideen, was könnte falsch sein? edit: Oh, ich habe die XNA Color Klasse nicht System.Drawing benutzt. –

+0

@JavidPack Funktioniert es jetzt für Sie? Oder fragen Sie, wie man das mit XNA Color macht? – poke

+0

Ja, tut mir leid, ich habe es herausgefunden. Der TypeConverter ist für die XNA Color unterschiedlich, er akzeptiert nur eine Folge von 4 durch Komma getrennten Zahlen: Das ist, was ich am Ende mit: [DefaultValue (typeof (Color), "165,42,42,255"]] –