我在嘗試序列化一個對象,該對象的字段和屬性用[DataMember(IsRequired = false,EmitDefaultValue = false)]裝飾] 我無法更改這些對象到源代碼),我需要能夠序列化所有字段和屬性,無論它們的值如何。 我嘗試過使用NullValueHandling.Include,但它沒有區別。是否有不同的設置可以讓我指示JSON.Net序列化這些屬性?如何在序列化對象字段和屬性時忽略EmitDefaultValue = false
這是一個非常簡單的示例類(同樣,記住,我不能以任何方式改變這一類):
[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}
Zero(0)是枚舉的默認C#值,所以當「dow」設置爲「Mon」時,序列化的JSON爲空,而在第二次嘗試時,使用「Tue」,我確實得到1的值。
我開始寫自己的ContractResolver,不得不放棄。最初的「GetSerializableMembers」代碼會對內部方法進行大量調用,我想避免將大量代碼覆蓋/複製到我自己的項目中。我相信可能有一個我在某處丟失的設置。
任何幫助將不勝感激。
由於提前,
古斯塔沃
爲什麼?它會正確地反序列化。 – EJP 2013-02-08 23:48:33
不是。該對象不會被C#使用。它正在通過瀏覽器上的JavaScript控制進行反序列化。該控件當前失敗,因爲它無法找到該屬性。謝謝。 – 2013-02-11 20:52:55
我嘗試了舊版本的JSON.NET庫(v3.5.0),它實際上忽略了EmitDefaultValue屬性。我現在正在使用它作爲解決方法。最近增加了對EmitDefaultValue的支持,我仍然無法找到覆蓋它的方法,而不改變被序列化的類(在這種情況下我不允許這樣做)。 – 2013-02-18 18:36:43