我试图在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>
答案 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
的修复程序。
本文提供有关默认媒体类型格式化程序的更多详细信息:
答案 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的示例格式化程序,这是我需要的。