Есть ли способ переназначения свойств модели ответа в 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
}
Ответы
Ответ 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/