web-dev-qa-db-fra.com

Renvoyer json avec la première lettre minuscule des noms de propriété

J'ai LoginModel:

public class LoginModel : IData
{
    public string Email { get; set; }
    public string Password { get; set; }
}

et j'ai la méthode de l'API Web

public IHttpActionResult Login([FromBody] LoginModel model)
{
    return this.Ok(model);
}

Et c'est le retour 200 et le corps:

{
    Email: "dfdf",
    Password: "dsfsdf"
}

Mais je veux obtenir avec la première lettre inférieure dans une propriété comme

{
    email: "dfdf",
    password: "dsfsdf"
}

Et j'ai résolveur de contrat Json pour corriger

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

Comment puis-je l'appliquer?

20
MihailPw

Pour forcer toutes les données json renvoyées de l'api au boîtier camel, il est plus facile d'utiliser Newtonsoft Json avec le résolveur de contrat par défaut du boîtier camel.

Créez une classe comme celle-ci:

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

et définissez-le lors de la configuration de l'API (au démarrage):

var jsonFormatter = new JsonMediaTypeFormatter();
httpConfiguration.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
19
Luca Ghersi

Si vous utilisez Newtonsoft.Json, vous pouvez ajouter JsonProperties à votre modèle de vue:

public class LoginModel : IData
{
     [JsonProperty(PropertyName = "email")]
     public string Email {get;set;}

     [JsonProperty(PropertyName = "password")]
     public string Password {get;set;}
}
18
AdrienTorris

Vous pouvez ajouter les deux instructions suivantes dans la configuration de l'API Web ou dans le fichier de démarrage

using Newtonsoft.Json; 
 using Newtonsoft.Json.Serialization; 
 
 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver (); [.____. .Configuration.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; 

Mais il est très important d'utiliser la méthode return Ok() au lieu de return Json()ou cela ne fonctionnera pas.

2
Hakan Fıstık