4

我试图在 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>
4

5 回答 5

4

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

在 beta 版本中,Web API 使用 DataContractJsonSerializer 来序列化 JSON。但是,情况发生了变化;最新版本的Web API 默认使用json.net,尽管您可以覆盖它并改用 DataContractJsonSerializer。

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

于 2012-05-07T03:12:42.107 回答
4

您可以将[JsonIgnore]属性用于特定于 JSON 的修复;或者您可以使用[DataContract]and[DataMember]进行修复,该修复既适用于 JSON 格式化程序,也适用于 (XML) DataContractSerializer

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

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

于 2013-11-10T06:01:50.257 回答
4

这对游戏来说有点晚了,但IgnoreDataMember正是我们在你/我的场景中需要的:

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

根据 MSDN,IgnoreDataMember附带 .NET 3.0 SP2。

于 2016-06-28T18:13:48.330 回答
1

JsonIgnore 修改整个类定义。如果您想控制特定的操作/请求,可以尝试这种方法

于 2013-10-17T20:39:27.853 回答
0

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

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

于 2012-05-07T03:17:01.653 回答