2016-05-26 8 views
1

私たちは、それをどのように表示するかをカスタムデータに注釈を付けるために属性を使用は:カスタム・シリアライズ使用して属性と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; 
} 

プロパティはString.Formatは属性が提供する形式を使用して処理されます。

ServiceStack.Text.JsonSerializerでもこの属性を使用するにはどのように設定する必要がありますか?

例:

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

は、カスタムプロパティの属性に基づいて直列化されるかの種類に建設され、変更することができます何のカスタマイズコールバックはありません

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

現在の出力は何ですか? –

答えて

3

を生成する必要があります。

このタイプのために必要なカスタム・シリアライズを取得するための一つのオプションはServiceStack.Textが代わりに使用していますToJson()メソッドを実装することで、例えば:

希望する結果出力し
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(); 
    } 
} 

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

また、既存のTypeを変更しない場合は、JsConfig<T>.RawSerializeFn implを登録し、代わりに使用するカスタムJSONを返すことで、既存のタイプのシリアライズをカスタマイズすることもできます。

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

'JsConfig 'は正確に 'T'にマッチしますか、それとも' T'のサブタイプにもマッチしますか? – 3dGrabber

+0

@ 3dGrabberは型とまったく同じです。 – mythz

関連する問題