.net – 根据其中一个属性将对象序列化为null

在Newtonsoft Json.NET自定义JsonConverter的WriteJson方法中,我可以在JsonConverter中上诉默认对象序列化行为吗?

也就是说,如果自定义转换器尚未注册,我是否可以遵循可能发生的序列化?

细节

鉴于价格等级

public class Price
{
    public string CurrencyCode;
    public decimal Amount;
}

正常的Newtonsoft Json.NET行为是仅在引用为null时将Price实例序列化为null.另外,我想在Price.Amount为零时将Price实例序列化为null.这是我到目前为止所做的工作(complete source code)

public class PriceConverter : JsonConverter 
{
    // ...

    public override void WriteJson(
        JsonWriter writer, 
        object value, 
        JsonSerializer serializer) 
    {
        var price = (Price)value;

        if (0 == price.Amount) {
            writer.WriteNull();
            return;
        }

        // I'd like to replace the rest of this method with an appeal to the 
        // default serialization behavior.
        writer.WriteStartObject();
        writer.WritePropertyName("amount");
        writer.WriteValue(price.Amount);
        writer.WritePropertyName("currencyCode");
        writer.WriteValue(price.CurrencyCode);
        writer.WriteEndObject();
    }

    // ...
}

这个实现的最后一部分是脆弱的.例如,如果我要向Price添加字段,我的序列化就会被破坏(我不知道编写一个能够检测到中断的测试的好方法).

我的序列化程序有许多行为,通过JsonSerializerSettings在单独的程序集中配置,我需要保留(例如,驼峰式属性名称).我不可能在这两者之间添加直接依赖关系.实际上,我正在使用[JsonConverter(typeof(PriceConverter))]属性来指定我的自定义转换器应该用于Price.

最佳答案 有一种解决方法可让转换器接收设置 – 您可以使用序列化上下文.

建立:

var settings = new JsonSerializerSettings { /*...*/ };
settings.Context = new StreamingContext(StreamingContextStates.All, settings);

在转换器中:

var settings = (JsonSerializerSettings)serializer.Context.Context;

我做的时候感觉很脏.

点赞