在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;
我做的时候感觉很脏.