对于我的ASP.NET MVC webservice,我有一个模型,我作为JSON对象返回。现在我的模型中有一些属性我不想返回。
示例模型:
class Account {
public int ID { get; }
public string Username { get; }
public string Password { get; }
//... more properties
}
假设我只想将ID
和Username
属性作为JSON返回。我正在寻找一种只过滤这些属性的好方法。更改访问修饰符对我来说不是一个选项。
我能想到的解决方案是创建如下所示的白名单。在这里,我添加了一个DisplayName
,这是一个很好的事情,能够自定义,但它不是必需的。
class FilterProperty
{
public string PropertyName { get; }
public string DisplayName { get; }
public FilterProperty(string propertyName, string displayName)
{
PropertyName = propertyName;
DisplayName = displayName;
}
}
class Account
{
public static FilterProperty[] Whitelist = {
new FilterProperty("ID", "accountId"),
new FilterProperty("Username", "accountName")
};
//...
}
此解决方案的缺点是:如果我要更改属性的名称,我也需要更改白名单。
我可以做这项工作还是有更好的解决方案?
答案 0 :(得分:2)
您的问题可能有多种解决方案:
创建一个ViewModel,其中包含唯一的必需属性,并从Original模型映射这些属性并返回该viewModel。您可以使用AutoMapper库将原始模型映射到视图模型。
另一件事是ASP.NET Web API使用Json.Net作为默认格式化程序,因此如果您的应用程序仅使用JSON作为数据格式,则可以使用[JsonIgnore]忽略序列化属性:
class Account {
public int ID { get; }
public string Username { get; }
[JsonIgnore]
public string Password { get; }
//... more properties
}
希望这会帮助你。
答案 1 :(得分:1)
Web API使用JSON.net作为默认序列化程序。
您可以添加JSONIgnore属性以跳过属性。
public class Class
{
// included in JSON
public string Model { get; set; }
public DateTime Year { get; set; }
public List<string> Features { get; set; }
// ignored
[JsonIgnore]
public DateTime LastModified { get; set; }
}
或者,如果您需要忽略大多数属性,可以使用opt in approach。
在您的类上使用DataContract属性,然后将Datamember仅添加到您要包含的属性
[DataContract]
public class Class
{
[DataMember]
public string Model { get; set; }
[DataMember]
public DateTime Year { get; set; }
// ignored
public List<string> Features { get; set; }
public DateTime LastModified { get; set; }
}
答案 2 :(得分:0)
如果您只关注命名,那么使用nameof运算符是一种选择。 (取决于.NET版本)
class Account
{
public static FilterProperty[] Whitelist = {
new FilterProperty(nameof(Account.ID), "accountId"),
new FilterProperty(nameof(Account.Username), "accountName")
};
//...
}