2015-11-19 41 views
1

爲了序列化自定義類,我使用Newtonsoft.Json,並且我有一個問題,該庫如何處理雙精度值的缺省值。JsonConvert.SerializeObject中的默認雙值處理

類可以像:

class Person 
{ 
    public string FullName { get; set; } 
    public double Score {get; set; } 
    public bool IsStudent {get; set; } 
    public double Weight {get;set; } 
} 

FullName哪裏和Score需要字段和IsStudent是一個可選字段。

如果序列化對象:

Person mark = new Person(); 
mark.FullName = "Mark Twain"; 
mark.Score = 0.0; 
var jsonMark = JsonConvert.SerializeObject(mark); 

什麼,我得到的是

{ 
    "FullName": "Mark Twain"; 
} 

因爲0.0表示爲double默認。

我需要始終傳遞該值,如果它是0.0。如果我用JsonSerializerSettings

var settings = new JsonSerializerSettings(); 
settings.DefaultValueHandling = DefaultValueHandling.Include; 
var jsonMark = JsonConvert.SerializeObject(mark); 

連載我得到

{ 
    "FullName": "Mark Twain", 
    "Score": 0.0, 
    "IsStudent": false, 
    "Weight": 0.0 
} 

因此所有屬性(在本演示IsStudentWeight),我沒有設置。在我的原始代碼中,該類包含其他doubleboolean字段,並且API不需要包含它們(如果我通過Weight等於0不是正確的值)。

有一種方法來改變序列化的行爲,只包括特定領域(對我來說只是Score但不IsStudentWeight),或至少僅在特定類型(double但不bool)?

回答

3

可以裝飾與JsonProperty屬性的特定屬性,以及DefaultValueHandling爲每一個專門設置:

class Person 
{ 
    public string FullName { get; set; } 
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)] 
    public double Score { get; set; } 
    public bool IsStudent { get; set; } 
    public double Weight { get; set; } 
} 
+0

謝謝!我添加了裝飾器到特定屬性,現在序列化也可以在值爲0.0時使用 –

+0

@GuidoPreite您好,非常感謝您的幫助。 –

0

是你想要的嗎?

class Person 
{ 
    public string FullName { get; set; } 
    public double Score {get; set; } 
    public bool IsStudent {get; set; } 
    public double? Weight {get;set; } 
} 

在這種情況下,如果您沒有設置權重,它將爲NULL。

+0

感謝您的回答,但對我來說,我不能讓物業爲空的,所以裝飾者是一個更好的解決方案 –