简化为最简单的形式,我有一个继承自另一个
的类public class BaseClass
{
protected int _property1;
public virtual int Property1
{
get
{
return _property1;
}
set
{
_property1 = value;
}
}
public int Property2 { get; set; }
}
public class InheritedClass : BaseClass
{
public override int Property1
{
set
{
_property1 = value + 1;
}
}
public int Property3 { get; set; }
}
和一个WebAPI控制器
public class TestController : ApiController
{
// GET api/test/5
public InheritedClass Get(int id)
{
return new InheritedClass
{
Property1 = id + 1,
Property2 = id,
Property3 = id - 1
};
}
}
如果我使用GET api/test/1
从控制器请求XML,我会得到我期望的数据
<InheritedClass>
<Property1>3</Property1>
<Property2>1</Property2>
<Property3>0</Property3>
</InheritedClass>
但如果我请求JSON,它会省略继承的属性。
{"Property3":0,"Property2":1}
我想要的是
{"Property1":3, "Property3":0, "Property2":1}
我可以通过将InheritedClass更改为
来解决此问题public class InheritedClass : BaseClass
{
public override int Property1
{
get
{
return _property1;
}
set
{
_property1 = value + 1;
}
}
...
但我真的不想 - 这似乎相当湿。是什么赋予了?我缺少JSONFormatter上的设置吗?
答案 0 :(得分:2)
您可以使用Formatters.JsonFormatter
对象的HttpConfiguration
配置Json序列化。
通过配置DefaultContractResolver
以明确搜索公共,非公共和实例属性,您可以修复您看到的行为。
您可以通过将以下代码添加到WebApiConfig.cs
文件夹中的App_Start
文件来执行此操作:
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new DefaultContractResolver
{
DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance
};