2016-05-26 9 views
1

Wir verwenden benutzerdefinierte Attribute Daten mit Anmerkungen zu versehen, wie es angezeigt werden soll:Benutzerdefinierte Serialisierung mit Attributen und ServiceStack.Text.JsonSerializer

public class DcStatus 
{ 
    [Format("{0:0.0} V")] public Double Voltage { get; set; } 
    [Format("{0:0.000} A")] public Double Current { get; set; } 
    [Format("{0:0} W")]  public Double Power => Voltage * Current; 
} 

Die Eigenschaften werden verarbeitet mit String.Format das Format durch das Attribut versehen werden.

Wie müssen wir ServiceStack.Text.JsonSerializer konfigurieren, um dieses Attribut zu verwenden?

Beispiel:

var test = new DcStatus {Voltage = 10, Current = 1.2}; 
var json = JsonSerializer.SerializeToString(test); 

sollte

{ 
    "Voltage": "10.0 V", 
    "Current": "1.200 A", 
    "Power" : "12 W", 
} 
+0

Was ist der aktuelle Ausgang? –

Antwort

3

produzieren Es gibt keine anpassbare Rückruf, der, wie Sie in Typen gebaut modifizieren können serialisiert werden basierend auf einer benutzerdefinierten Eigenschaft Attribut.

Eine Option, um die gewünschte benutzerdefinierte Serialisierung für diese Art zu erhalten, ist ein ToJson() Verfahren zu implementieren, die ServiceStack.Text verwendet stattdessen, zB:

public class DcStatus 
{ 
    [Format("{0:0.0} V")] 
    public Double Voltage { get; set; } 
    [Format("{0:0.000} A")] 
    public Double Current { get; set; } 
    [Format("{0:0} W")] 
    public Double Power => Voltage * Current; 

    public string ToJson() 
    { 
     return new Dictionary<string,string> 
     { 
      { "Voltage", "{0:0.0} V".Fmt(Voltage) }, 
      { "Current", "{0:0.000} A".Fmt(Current) }, 
      { "Power", "{0:0} W".Fmt(Power) }, 
     }.ToJson(); 
    } 
} 

die das gewünschte Ergebnis ausdruckt:

var test = new DcStatus { Voltage = 10, Current = 1.2 }; 
test.ToJson().Print(); //= {"Voltage":"10.0 V","Current":"1.200 A","Power":"12 W"} 

Wenn Sie den vorhandenen Typ nicht ändern möchten, können Sie die Serialisierung für einen vorhandenen Typ auch anpassen, indem Sie ein JsConfig<T>.RawSerializeFn Impl registrieren und den benutzerdefinierten JSON, den Sie verwenden möchten, zurückgeben, z. B .:

JsConfig<DcStatus2>.RawSerializeFn = o => new Dictionary<string, string> { 
    { "Voltage", "{0:0.0} V".Fmt(o.Voltage) }, 
    { "Current", "{0:0.000} A".Fmt(o.Current) }, 
    { "Power", "{0:0} W".Fmt(o.Power) }, 
}.ToJson(); 
+0

Passt 'JsConfig ' genau zu 'T' oder passt es auch zu Untertypen von' T'? – 3dGrabber

+0

@ 3dGrabber entspricht genau dem Typ. – mythz

Verwandte Themen