这个问题已经在这里有了答案: > custom serializer for just one property in Json.NET 3个
我正在为一个域建模,并且对于少数几个属性,即使它们的值很简单,我也不想使用内置的整数(例如int)或非常普通的类型(例如System.Guid).
因此,我介绍了一些简单的“包装”类型.结合使用隐式运算符,我对结果感到满意:
class Order
{
public Price Price { get; set; }
}
order.Price = 4.95m;
价格“包装”十进制并将值存储在名为value的私有字段中.
我现在将对象序列化为JSON,并且我希望将上述对象序列化为:
{
"Price": 4.95
}
但是到目前为止,我只能通过将该字段设置为公共财产来像这样序列化它:
{
"Price": {
"Value": 4.95
}
}
您是否知道一种以我描述的方式进行序列化和反序列化的方法(最好是与NewtonSoft.Json结合使用)?
解决方法:
您可以使用自定义转换器执行此操作.例如:
public class PriceConverter : JsonConverter<Price>
{
public override Price ReadJson(JsonReader reader, Type objectType, Price existingValue,
bool hasExistingValue, JsonSerializer serializer)
{
var value = Convert.ToDecimal(reader.Value);
return new Price { Value = value };
}
public override void WriteJson(JsonWriter writer, Price value, JsonSerializer serializer)
{
writer.WriteValue(value.Value);
}
}
现在,您只需要告诉JSON.Net使用该转换器即可.一种方法是将其添加到序列化器设置中:
//Create the settings object and add the converter
var settings = new JsonSerializerSettings();
settings.Converters.Add(new PriceConverter());
//Use the settings
var json = JsonConvert.SerializeObject(order, settings);
var newOrder = JsonConvert.DeserializeObject<Order>(json, settings);
或者,使用属性在属性上告诉JSON.Net使用哪个转换器:
public class Order
{
[JsonConverter(typeof(PriceConverter))]
public Price Price { get; set; }
}
或上课:
[JsonConverter(typeof(PriceConverter))]
public class Price
{
public decimal Value { get; set; }
}