2016-07-25 59 views
0

我有以下JSONNewtonsoft的Json去serealization不忽略空

{ 
    "PROPERTY1": "vvv", 
    "PROPERTY2": "aa", 
} 

,我想用下面的數據模型類

public class Class1 
{ 
    public Class1() 
    { 

    } 

    [JsonProperty(Required = Required.Always)] 
    public string PROPERTY1{ get; set; } 

    [JsonProperty(Required = Required.Always)] 
    public string PROPERTY2{ get; set; } 

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public decimal PROPERTY3 { get; set; } 

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public string PROPERTY4 { get; set; } 

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public SomeObject PROPERTY5 { get; set; } 

}

而下面的序列化代碼中使用反序列化

deserializedResponse = JsonConvert.DeserializeObject<Class1>(response); 

因此,我期望獲得PROPERTY1和PROPERTY2的第1類, 實際上,我獲得了所有4個屬性,而PROPERTY3是0,PROPERTY4 = null,PROPERTY5 =「」。

試圖通過序列設置爲2參數

JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings 
    {  
     NullValueHandling = NullValueHandling.Ignore 
    }; 

沒有幫助。

我想Class1的對象沒有PROPERTY3和PROPERTY4和PROPERTY5如果他們沒有在JSON

任何建議本?

+3

這是什麼問題?當然,你仍然擁有屬於課堂的屬性。他們只會有他們的默認值(因此'null'和'0')。空處理是用於序列化的,寫出時它們將被忽略。如果你想要一個動態類型,使用'dynamic'而不是一個具體的類。 – Lloyd

+0

另外,您的JSON無效。應該是{ 「PROPERTY1」: 「VVV」, 「PROPERTY2」: 「AA」 } – Antipod

+0

@Lloyd錯字:-)我想Class1的對象沒有PROPERTY3和PROPERTY4如果他們沒有在JSON –

回答

2
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
public decimal PROPERTY3 { get; set; } 

您的屬性是一個值類型。這總是有價值的。它會得到一個0,並且這在分配時會改變。你必須轉換爲Nullable類型才能使該屬性變爲null。

您也可以使用動態。請參閱:Deserialize json object into dynamic object using Json.net

這使您可以僅使用存在的屬性。其他問題都解釋如何檢查性能的所有腦幹答案:How do I check if a property exists on a dynamic anonymous type in c#?

+1

或使用DefaultValueHandling。 – yaakov

+0

@Sascha我想,沒有PROPERTY3和PROPERTY4和PROPERT5如果他們在JSON不存在Class1的對象。 –

+0

@AlexanderGorelik查看更新後的問題 – Sascha

1

如果你不想PROPERTY3和PROPERTY4如果他們不能在JSON,你應該反序列化這樣的:

deserializedResponse = JsonConvert.DeserializeObject<object>(response, jsonSerializerSettings);

我而不是反序列化爲class1,則應反序列化爲一個通用對象。我只是不確定這個廁所。

+0

檢查財產所有腦幹在1級Property1和Property2是強制性的,其他屬性都optional.I會拋出異常,如果前兩者是不存在的,而且會檢查其他3來完成我的驗證過程。我想檢查屬性的存在,而不是他們的價值。 –

+0

@AlexanderGorelik即使是這樣,你應該使用可空類型或缺省值處理。其他一切都是反射或動態編程,這可能是一個嚴重的性能問題...... – Sascha

1

在這種情況下,你應該創建一個繼承:

Class1與PROPERTY1和PROPERTY2。

Class2,由PROPERTY3,PROPERTY4和PROPERTY5派生的Class1。

NullValueHandling僅用於序列化目的。