2017-07-28 140 views
0

的問題是我有不同類型的對象(它知道如何與一個類型處理這個): 事情是這樣的:反序列化JSON成不同的對象類型與Json.net

{"myObjects": [ 
     { 
      "Type":"sampleType1", 
      "Name":"sampleName1", 
      "Size":"sampleSize1" 
     }, 
     { 
      "Type":"sampleType2", 
      "Name":"sampleName2", 
      "Size":"sampleSize2" 
     } 
    ] 
} 

我只是處理:

JsonConvert.DeserializeObject<MyObjectContainer>(json); 

其中MyObjectContainer有一個屬性:

public List<MyObjects> myObjects { get; set; } 

Ť他問題來了,當我得到一個對象的可選參數:

{"myObjects": [ 
     { 
      "Type":"sampleType1", 
      "Name":"sampleName1", 
      "Size":"sampleSize1" 
     }, 
     { 
      "Type":"sampleType2", 
      "Name":"sampleName2", 
      "Size":"sampleSize2", 
      "AdditionalInfo":"AdditionalInfo" 
     } 
    ] 
} 

要序列化它會很容易,我認爲。我將使用屬性字符串AdditionalInfo創建類AdditionalInfoObject:MyObject。

但如何反序列化這樣的json到我的列表?

回答

0

您可以告訴JSON序列化程序忽略該屬性,如果該屬性爲null。但請記住,這隻會忽略每個屬性都爲空的屬性。因此,如果使用除此以外的默認值進行初始化,這將不起作用。

下面是一個〔實施例:How to ignore a property in class if null, using json.net

+0

你能給我另一個提示如何處理它嗎? 我只是無法看到我可以如何反序列化我的示例中的第二個json到包含兩個不同對象類型(Myobject,AdditionalInfoObject)的某個datacontainer中, – cantdoanything33

0

你可以嘗試像下面的代碼。根據你的Json格式,我已經創建瞭如下所示的淡化類。

public class myObjects 
{ 
    public string Type { get; set; } 
    public string Name { get; set; } 
    public string Size { get; set; } 
    public string AdditionalInfo { get; set; } 
} 

public class objMain 
{ 
    public List<myObjects> myObjects { get; set; } 
} 

之後你可以調用像下面這樣的反序列化方法。

注意: - 如果在您的josn中找到AdditionalInfo屬性,那麼它會給你這個值,否則它將爲空。不需要額外的照顧。

var jsonData = "{ 'myObjects': [{'Type':'sampleType1','Name':'sampleName1','Size':'sampleSize1'},{'Type':'sampleType2','Name':'sampleName2','Size':'sampleSize2'}]}"; 
string jsonData1 = "{ 'myObjects': [{'Type':'sampleType1','Name':'sampleName1','Size':'sampleSize1'},{'Type':'sampleType2','Name':'sampleName2','Size':'sampleSize2','AdditionalInfo':'AdditionalInfo' }]}"; 

objMain myNames = JsonConvert.DeserializeObject<objMain>(jsonData); 
objMain myNames1 = JsonConvert.DeserializeObject<objMain>(jsonData1);