Подтвердить что ты не робот

Есть ли способ переназначения свойств модели ответа в ASP.Net Web API

Если вы хотите возвращать объекты из методов действий в Web Api с именами нижнего регистра стиля JSON, существует ли способ псевдонимов имен свойств, чтобы объект С# ниже выглядел как следующий объект JSON.

Модель ответа на С#

    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
    }
4b9b3361

Ответ 1

Вы можете использовать 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; }   
    }

Это будет работать только с 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; }   
    }

Ответ 2

Ответ 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

Edit Основываясь на комментариях ниже, я пошел дальше и добавил сообщение в блоге с полным решением здесь: http://www.ryanvice.net/uncategorized/extending-json-net-to-serialize-json-properties-using-a-format-that-is-delimited-by-dashes-and-all-lower-case/