28

如果您想使用 JSON 样式的小写名称从 Web Api 中的操作方法返回对象,有没有办法给属性名称起别名,以便下面的 C# 对象看起来像下面的 JSON 对象。

C# 响应模型

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

    }

我希望返回的 JSON

    {
        "id" : 12,
        "account-name" : "Primary Checking",
        "account-balance" : 1000
    }
4

2 回答 2

55

您可以使用 JSON.NETJsonProperty

 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; }   
    }

这仅适用于 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; }   
    }
于 2013-01-12T23:37:36.137 回答
21

如果您需要对序列化进行精细控制,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.
    }
}

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-由破折号和全小写/分隔的格式/

于 2013-01-14T14:14:52.773 回答