在 Newtonsoft Json.NET 自定义中 JsonConverter
的 WriteJson
方法,我可以从 JsonConverter
中上诉默认对象序列化行为吗? ?
也就是说,如果未注册自定义转换器,我是否可以遵循会发生的序列化?
细节
给定一个价格类
public class Price
{
public string CurrencyCode;
public decimal Amount;
}
Newtonsoft Json.NET 的正常行为是序列化
Price
仅当引用为空时实例为空。另外,我想序列化 Price
任何时候实例为空 Price.Amount
为零。这是我到目前为止所做的工作( 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;
不过我做的时候觉得很脏。
关于.net - 根据其属性之一将对象序列化为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16948446/