使用属性和 ServiceStack.Text.JsonSerializer 的自定义序列化
Custom Serialization using Attributes and 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",
}
没有可自定义的回调让您修改内置类型的序列化方式基于自定义 属性 属性。
为此类型获得所需的自定义序列化的一个选项是实现 ToJson()
方法,ServiceStack.Text 使用该方法,例如:
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"}
否则,如果您不想更改现有类型,您还可以通过注册 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();
我们使用自定义属性来注释数据的显示方式:
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",
}
没有可自定义的回调让您修改内置类型的序列化方式基于自定义 属性 属性。
为此类型获得所需的自定义序列化的一个选项是实现 ToJson()
方法,ServiceStack.Text 使用该方法,例如:
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"}
否则,如果您不想更改现有类型,您还可以通过注册 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();