Вернуть json с первой буквы имени свойства в нижнем регистре
У меня есть LoginModel:
public class LoginModel : IData
{
public string Email { get; set; }
public string Password { get; set; }
}
и у меня есть метод веб-API
public IHttpActionResult Login([FromBody] LoginModel model)
{
return this.Ok(model);
}
И это возврат 200 и кузов:
{
Email: "dfdf",
Password: "dsfsdf"
}
Но я хочу получить с нижней буквы в собственности, как
{
email: "dfdf",
password: "dsfsdf"
}
И у меня есть JSON для разрешения ошибок
public class FirstLowerContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
if (string.IsNullOrWhiteSpace(propertyName))
return string.Empty;
return $"{char.ToLower(propertyName[0])}{propertyName.Substring(1)}";
}
}
Как я могу применить это?
3 ответа
Чтобы форсировать все данные json, возвращаемые из api в дело верблюда, проще использовать Newtonsoft Json со стандартным определителем контракта дела верблюда.
Создайте класс как этот:
using Newtonsoft.Json.Serialization;
internal class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter _jsonFormatter;
public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
_jsonFormatter = formatter;
_jsonFormatter.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver();
}
public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
return new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
}
}
и установите это во время настройки API (при запуске):
var jsonFormatter = new JsonMediaTypeFormatter();
httpConfiguration.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
Если вы используете Newtonsoft.Json, вы можете добавить JsonProperties к вашей модели представления:
public class LoginModel : IData
{
[JsonProperty(PropertyName = "email")]
public string Email {get;set;}
[JsonProperty(PropertyName = "password")]
public string Password {get;set;}
}
Вы можете добавить два следующих утверждения в конфигурации веб-API или в файл запуска
используя Newtonsoft.Json; использование Newtonsoft.Json.Serialization; GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;
Но очень важно использовать return Ok()
метод вместо return Json()
или это не сработает.
Если вам это нужно только в определенном месте, а не во всем приложении, вы можете сделать следующее:
var objectToSerialize = new {Property1 = "value1", SubOjbect = new { SubObjectId = 1 }};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() });
Это должно привести к {"property1":"value1","subOjbect":{"subObjectId":1}}
(обратите внимание, что вложенные свойства также начинаются с нижнего регистра)