我正在尝试序列化具有用 [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”代码对内部方法进行了大量调用,我希望避免将这么多代码覆盖/复制到我自己的项目中。我相信我可能在某处缺少一个设置。
任何帮助将不胜感激。
提前致谢,
古斯塔沃