.net - 根据其属性之一将对象序列化为 null

标签 .net json serialization json.net

在 Newtonsoft Json.NET 自定义中 JsonConverterWriteJson方法,我可以从 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/

相关文章:

c# - 是否可以在 ASP.NET 中保留页面之间的 View 状态?

json - 如何在golang中将字符串转换为json?

java - Gson:序列化时如何忽略@SerializeName

c# - 使用上一页获取 GridView 选定行值

.net - 在不使用 FOR XML PATH 的情况下将多个结果行连接成单个结果

sql - 为什么Json转入db?

c# - Json.Net 未正确序列化版本类型

c# - 在 C# 中删除继承对象的属性

c# - EF 4.4 不检测 AutoMapper 所做的更改

json - 从 shell 更改 JSON 数据文件中的值