使用Json.net将Json反序列化为不同的对象类型

时间:2017-07-28 06:50:04

标签: c# .net 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反序列化到我的列表中?

2 个答案:

答案 0 :(得分:0)

如果属性为null,则可以告诉JSON Serializer忽略该属性。但请注意,这将忽略每个属性为null的属性。因此,如果使用除此之外的默认值进行初始化,则无法正常工作。

这是一个例子:How to ignore a property in class if null, using json.net

答案 1 :(得分: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属性,那么它将为您提供其他值,它将为null。无需额外的照顾。

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);