2017-07-28 143 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);