Вернуть 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}} (обратите внимание, что вложенные свойства также начинаются с нижнего регистра)

Другие вопросы по тегам