Asp.net web api 有没有办法在ASP.NETWebAPI中别名响应模型属性
如果您想从Web Api中的action方法返回具有JSON样式小写名称的对象,是否有一种方法可以对属性名称进行别名,以便下面的C#对象看起来像后面的JSON对象 C#响应模型Asp.net web api 有没有办法在ASP.NETWebAPI中别名响应模型属性,asp.net-web-api,Asp.net Web Api,如果您想从Web Api中的action方法返回具有JSON样式小写名称的对象,是否有一种方法可以对属性名称进行别名,以便下面的C#对象看起来像后面的JSON对象 C#响应模型 公共类帐户 { 公共int Id{get;set;} 公共字符串AccountName{get;set;} 公共十进制帐户余额{get;set;} } 我希望返回的JSON { "id" : 12, "account-name" : "Primary Checking",
公共类帐户
{
公共int Id{get;set;}
公共字符串AccountName{get;set;}
公共十进制帐户余额{get;set;}
}
我希望返回的JSON
{
"id" : 12,
"account-name" : "Primary Checking",
"account-balance" : 1000
}
您可以使用JSON.NET的
JsonProperty
公共类帐户
{
[JsonProperty(PropertyName=“id”)]
公共int Id{get;set;}
[JsonProperty(PropertyName=“帐户名”)]
公共字符串AccountName{get;set;}
[JsonProperty(PropertyName=“账户余额”)]
公共十进制帐户余额{get;set;}
}
显然,这只适用于JSON.NET。如果您希望更加不可知,并且这种类型的命名能够用于其他潜在的格式化程序(即,您将JSON.NET更改为其他格式,或用于XML序列化),请参考System.Runtime.serialization
,并使用:
[DataContract]
公共类帐户
{
[数据成员(Name=“id”)]
公共int Id{get;set;}
[DataMember(Name=“账户名称”)]
公共字符串AccountName{get;set;}
[DataMember(Name=“账户余额”)]
公共十进制帐户余额{get;set;}
}
如果您需要对序列化进行粒度控制,那么上面的Filip的答案非常好,但是如果您想进行全局更改,可以使用如下所示的一行程序
公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(新的StringEnumConverter());
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver=
new CamelCasePropertyNamesContractResolver();//默认情况下,此行将导致使用CamelCase。
}
}
编辑
根据下面的评论,我在这里添加了一篇博客文章,其中包含完整的解决方案:虽然这是一个好主意,显然比定义所有这些属性更容易,但这并不是OP所要求的。它不能解决破折号问题。@Ryan您的链接不起作用,现在它位于此处:对于此解决方案的用户,请注意,将
[DataContract]
应用于类需要在所有要序列化的属性上使用[DataMember]
属性。也就是说,如果您从一个具有10个默认情况下当前序列化的属性的类开始,并将[DataContract]
添加到该类中,并将[DataMember(Name=“a-new-Name”)]
添加到该属性中,则其他9个属性将不再序列化。您如何更改模型名称(此处为帐户)?