Web API使用属性对属性进行条件序列化

时间:2015-04-16 16:06:48

标签: asp.net-web-api

如何根据用户使用属性的角色在WEB API响应中包含/排除属性?例如:

public class Employee 
{ 
    public string FullName { get; set;}

    [DataMember(Role="SystemAdmin")] // included only for SystemAdmins
    public string SSN { get; set; }
}

1 个答案:

答案 0 :(得分:3)

您可以使用条件序列化,具体取决于您在web api中使用的序列化程序。

如果你只是从Web API返回JSON那么简单 - 我只使用JSON序列化程序,这个解决方案适合我。默认情况下,Web API使用JSON.Net进行JSON序列化。您可以添加一个返回bool的ShouldSerialize方法。在序列化中,您可以测试用户是否为IsInRole

public class Employee
{
   public string Name { get; set; }
   public string Manager { get; set; }

   public bool ShouldSerializeManager()
   {
    // don't serialize the Manager property for anyone other than Bob..
    return (Name == "Bob");
   }

}

更多details

使用JSON.Net Web API序列化时,[JsonIgnore]属性全部或全无。

其他序列化程序需要不同的方法......

XmlSerializer也支持此功能,但您必须启用它

config.Formatters.XmlFormatter.UseXmlSerializer = true;  

datacontract序列化程序是默认值。

如果使用这个,你必须在属性中添加逻辑,如果为null则省略它们。如果你在其他地方使用这个类,这可能是个问题。 [IgnoreDataMember]属性全部或全无。

[DataContract]
public class Person
{
  private string firstName;
  [DataMember(IsRequired = false, EmitDefaultValue = false)]
  public string FirstName
  {
    get
    {
        //Put here any condition for serializing
        return string.IsNullOrWhiteSpace(firstName) ? null : firstName;
    }
    set
    {
        firstName = value;
    }
  }
}