ASP.net WebAPI中JSONFormatter和XmlFormatter的不同行为

时间:2013-08-29 09:58:30

标签: c# asp.net asp.net-web-api json.net

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

的类
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上的设置吗?

1 个答案:

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