使用NewtonSoft Json.NET

时间:2015-04-23 14:25:28

标签: c# json inheritance serialization json.net

更新:已解决!看起来Json.NET默认包含派生类型属性,但由于我的代码中出现类型被基类型覆盖的错误,因此不包括它们。

我目前正在为学校做一个项目,我偶然发现了一个问题。

我需要将对象序列化为Json,我使用Newtonsoft Json.NET。我试图序列化的对象有一个特定基类的对象列表,但该列表中的对象是具有自己唯一属性的派生类型。

目前,只有基类的属性包含在生成的Json中。如果可能,我希望Json转换器检测集合中对象的派生类,并序列化它们的唯一属性。

下面是一些代码,作为我正在做的事情的一个例子。

我使用的类:

public class WrappingClass
{
    public string Name { get; set; }
    public List<BaseClass> MyCollection { get; set; }
}

public class BaseClass
{
    public string MyProperty { get; set; }
}

public class DerivedClassA : BaseClass
{
    public string AnotherPropertyA { get; set; }
}

public class DerivedClassB : BaseClass
{
    public string AnotherPropertyB { get; set; }
}

序列化一些虚拟对象:

WrappingClass wrapperObject = new WrappingClass
{
    Name = "Test name",
    MyCollection = new List<BaseClass>();
};

DerivedClassA derivedObjectA = new DerivedClassA
{
    MyProperty = "Test my MyProperty A"
    AnotherPropertyA = "Test AnotherPropertyA"
};

DerivedClassB derivedObjectB = new DerivedClassB
{
    MyProperty = "Test my MyProperty B"
    AnotherPropertyB = "Test AnotherPropertyB"
};

wrapperObject.MyCollection.Add(derivedObjectA);
wrapperObject.MyCollection.Add(derivedObjectB);

var myJson = JsonConvert.SerializeObject(wrapperObject);

目前将生成的Json:

{"Name":"Test name","MyCollection":[{"MyProperty":"Test my MyProperty A"}{"MyProperty":"Test my MyProperty B"}]}

我想要的Json:

{"Name":"Test name","MyCollection":[{"MyProperty":"Test my MyProperty A","AnotherPropertyA":"Test AnotherPropertyA"},{"MyProperty":"Test my MyProperty B","AnotherPropertyB":"Test AnotherPropertyB"}]}

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

json.NET的默认行为是包含派生类型的所有属性。你没有得到它们的唯一原因是你在基类型上定义了一个[DataContract],你没有扩展到派生类型,或者你有像optin序列化等。

答案 1 :(得分:-1)

如果您不想将它们序列化为

,则使用“忽略”属性装饰属性

&#13;
&#13;
public class DerivedClassA : BaseClass
{
    [JsonIgnore]
    public string AnotherPropertyA { get; set; }
}
&#13;
&#13;
&#13;