如何在序列化对象字段和属性时忽略EmitDefaultValue = false

时间:2013-02-08 23:00:08

标签: json serialization json.net

我正在尝试序列化一个对象,该对象具有用[DataMember(IsRequired = false,EmitDefaultValue = false)]修饰的字段和属性 我无法更改这些对象(无法访问源代码),我需要能够序列化所有字段和属性,无论它们的值如何。 我尝试使用NullValueHandling.Include,但它没有任何区别。是否有不同的设置允许我指示JSON.Net序列化这些属性?

这是一个非常简单的示例类(再次请记住,我无法以任何方式更改此类):

[Serializable]
[DataContract]
class SampleClass2
{
    public SampleClass2()
    {
        dow = daysOfWeek.Mon;
    }

    public enum daysOfWeek { Mon = 0, Tue = 1, Wed = 2, Thu = 3, Fri = 4, Sat = 5, Sun = 6 };

    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public daysOfWeek dow;
}

我用来序列化它的代码:

    public static void TestSerializeSampleClass2()
    {
        SampleClass2 sc2 = new SampleClass2();
        sc2.dow = SampleClass2.daysOfWeek.Mon;

        string json = "";

        Newtonsoft.Json.JsonSerializerSettings jss =
            new Newtonsoft.Json.JsonSerializerSettings() { DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include, NullValueHandling = Newtonsoft.Json.NullValueHandling.Include };
        // jss.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;
        json = Newtonsoft.Json.JsonConvert.SerializeObject(sc2, jss);
        Console.WriteLine(json);


        sc2.dow = SampleClass2.daysOfWeek.Tue;
        json = Newtonsoft.Json.JsonConvert.SerializeObject(sc2, jss);
        Console.WriteLine(json);


        Console.WriteLine("");
        Console.ReadLine();
    }

运行此输出:

{} { “陶氏”:1}

零(0)是枚举的默认C#值,因此当“dow”设置为“Mon”时,序列化的JSON为空,而在第二次尝试时,使用“Tue”我得到值1。

我开始编写自己的ContractResolver并不得不放弃。原始的“GetSerializableMembers”代码对内部方法进行了大量调用,我希望避免将这么多代码覆盖/复制到我自己的项目中。我相信可能会有一个我在某处失踪的环境。

非常感谢任何帮助。

提前致谢,

古斯塔沃

1 个答案:

答案 0 :(得分:0)

DataContract Surrogates不能在这里工作吗?

http://msdn.microsoft.com/en-us/library/ms733064%28v=vs.110%29.aspx

你可以用你想要的任何装饰器创建一个Surrogate类(所以没有EmitDefaultValue = false),这应该可以工作,而不需要复制整个初始类代码。