-4

简化为最简单的形式,我有一个继承自另一个的类

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

如果我从控制器请求 XML,使用GET api/test/1,我得到我期望的数据

<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 上是否有设置?

4

1 回答 1

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
     };
于 2013-08-29T11:47:20.377 回答