从ApiController中的json序列化中排除属性

时间:2012-05-07 00:57:50

标签: asp.net serialization asp.net-mvc-4 asp.net-web-api

我试图在Web ApiControllers中排除属性序列化为JSON。我已经验证了以下两种方案的工作原理。

我在要排除的属性中包含以下属性。

[System.Web.Script.Serialization.ScriptIgnore]
[System.Xml.Serialization.XmlIgnore]

如果我使用JavaScriptSerializer手动序列化我的对象,则会排除该属性。此外,如果我从Web ApiController查看序列化XML输出,则排除该属性。问题是,通过Web ApiController的序列化JSON仍然包含该属性。是否有我可以使用的属性将JSON序列化中的属性排除?

更新

我意识到我所有的测试都在一个更复杂的项目中,并且我没有在一个孤立的环境中尝试过。我做到了这一点,我仍然得到相同的结果。以下是一些失败的代码示例。

public class Person
{
    public string FirstName { get; set; }

    [System.Web.Script.Serialization.ScriptIgnore]
    [System.Xml.Serialization.XmlIgnore]
    public string LastName { get; set; }
}

public class PeopleController : ApiController
{
    public IEnumerable<Person> Get()
    {
        return new[]
                   {
                       new Person{FirstName = "John", LastName = "Doe"},
                       new Person{FirstName = "Jane", LastName = "Doe"}
                   };
    } 
}

这是生成的输出。

JSON:

[
    {
        "FirstName" : "John",
        "LastName" : "Doe"
    },
    {
        "FirstName" : "Jane",
        "LastName" : "Doe"
    }
]

XML:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Person>
        <FirstName>John</FirstName>
    </Person>
    <Person>
        <FirstName>Jane</FirstName>
    </Person>
</ArrayOfPerson>

5 个答案:

答案 0 :(得分:4)

请注意,Web API中的JSON序列化正在发生变化。

在测试版中,Web API使用DataContractJsonSerializer来序列化JSON。然而,这已经改变了;默认情况下,latest version Web API使用json.net,但您可以覆盖它并使用DataContractJsonSerializer。

使用DataContractJsonSerializer,您可以使用[DataContract]属性来控制序列化。我对json.net并不是很熟悉,所以我不知道它如何控制序列化。

答案 1 :(得分:4)

您可以使用[JsonIgnore]属性进行特定于JSON的修复;或者您可以使用[DataContract][DataMember]获得适用于JSON格式化程序和(XML)DataContractSerializer的修复程序。

本文提供有关默认媒体类型格式化程序的更多详细信息:

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_media_type_formatter

答案 2 :(得分:4)

游戏有点晚了,但 IgnoreDataMember 正是我们在您/我的场景中所需要的:

[System.Runtime.Serialization.IgnoreDataMember]
public int NotSerialized { get; set; }

根据MSDN,IgnoreDataMember引入了.NET 3.0 SP2。

答案 3 :(得分:1)

JsonIgnore修改整个类定义。如果您想控制特定的操作/请求,可以try this approach

答案 4 :(得分:0)

看起来这涵盖了我需要的东西。它向您显示您可以换出格式化程序。它甚至包括一个使用JavaScriptSerializer的示例格式化程序,这是我需要的。

http://wildermuth.com/2012/2/22/WebAPI_for_the_MVC_Guy