有没有办法在ASP.Net Web API中对响应模型属性进行别名

Rya*_*ice 25 asp.net-web-api

如果要使用JSON样式小写名称从Web Api中的操作方法返回对象,是否有一种方法可以对属性名称进行别名,以便下面的C#对象看起来像后面的JSON对象.

C#响应模型

    public class Account
    {
        public int Id { get; set; }
        public string AccountName { get; set; }
        public decimal AccountBalance { get; set; }

    }
Run Code Online (Sandbox Code Playgroud)

JSON,我想退回

    {
        "id" : 12,
        "account-name" : "Primary Checking",
        "account-balance" : 1000
    }
Run Code Online (Sandbox Code Playgroud)

Fil*_*p W 52

你可以使用JSON.NET JsonProperty

 public class Account
    {
        [JsonProperty(PropertyName="id")]
        public int Id { get; set; }
        [JsonProperty(PropertyName="account-name")]
        public string AccountName { get; set; }
        [JsonProperty(PropertyName="account-balance")]
        public decimal AccountBalance { get; set; }   
    }
Run Code Online (Sandbox Code Playgroud)

这只适用于JSON.NET - 显然.如果您想要更加不可知,并且让这种类型的命名能够用于其他可能的格式化程序(即您将JSON.NET更改为其他内容,或者用于XML序列化),请参考System.Runtime.Serialization和使用:

 [DataContract]
 public class Account
    {
        [DataMember(Name="id")]
        public int Id { get; set; }
        [DataMember(Name="account-name")]
        public string AccountName { get; set; }
        [DataMember(Name="account-balance")]
        public decimal AccountBalance { get; set; }   
    }
Run Code Online (Sandbox Code Playgroud)

  • 对于此解决方案的用户,请注意将`[DataContract]`应用于类需要您要序列化的*all*属性上的`[DataMember]`属性.即如果你从一个具有默认情况下当前序列化的10个属性的类开始,并将`[DataContract]`添加到该类并将`[DataMember(Name ="a-new-name")]`添加到该属性,另一个9个属性不再被序列化. (3认同)

Rya*_*ice 19

如果您需要对序列化进行精细控制,那么上面的Filip答案非常好,但是如果您想进行全局更改,可以使用如下所示的单线程来完成.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =
            new CamelCasePropertyNamesContractResolver();  // This line will cause camel casing to happen by default.
    }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑 根据下面的评论,我在这里添加了一篇博文,其中包含完整的解决方案:http://www.ryanvice.net/uncategorized/extending-json-net-to-serialize-json-properties-using-a-格式-即-被分隔逐破折号和-全小写/