编程语言
首页 > 编程语言> > 如何将类似C#“单例并集类型”的对象序列化为其基础值并返回?

如何将类似C#“单例并集类型”的对象序列化为其基础值并返回?

作者:互联网

这个问题已经在这里有了答案:            >            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; }  
}

标签:serialization,json,c
来源: https://codeday.me/bug/20191210/2104637.html