330 votes

Comment renvoyer du JSON camelcase sérialisé par JSON.NET à partir des méthodes du contrôleur ASP.NET MVC ?

Mon problème est que je souhaite renvoyer des données JSON en camelCase (par opposition au PascalCase standard) via ActionResult à partir des méthodes de contrôleur ASP.NET MVC, sérialisées par JSON.NET.

Comme exemple, prenez la classe C# suivante :

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Par défaut, lorsqu'on renvoie une instance de cette classe à partir d'un contrôleur MVC en JSON, elle sera sérialisée de la manière suivante :

{
  "FirstName": "Joe",
  "LastName": "Public"
}

Je voudrais qu'elle soit sérialisée (par JSON.NET) comme :

{
  "firstName": "Joe",
  "lastName": "Public"
}

Comment puis-je faire cela ?

507voto

WebDever Points 3371

Ou, en d'autres termes:

JsonConvert.SerializeObject(
    , 
    new JsonSerializerSettings 
    { 
        ContractResolver = new CamelCasePropertyNamesContractResolver() 
    });

Par exemple:

return new ContentResult
{
    ContentType = "application/json",
    Content = JsonConvert.SerializeObject(new { contenu = resultat, lignes = dto }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }),
    ContentEncoding = Encoding.UTF8
};

106voto

aknuds1 Points 9918

J'ai trouvé une excellente solution à ce problème sur le blog de Mats Karlsson. La solution est d'écrire une sous-classe de ActionResult qui sérialise les données via JSON.NET, en configurant ce dernier pour suivre la convention camelCase :

public class JsonCamelCaseResult : ActionResult
{
    public JsonCamelCaseResult(object data, JsonRequestBehavior jsonRequestBehavior)
    {
        Data = data;
        JsonRequestBehavior = jsonRequestBehavior;
    }

    public Encoding ContentEncoding { get; set; }

    public string ContentType { get; set; }

    public object Data { get; set; }

    public JsonRequestBehavior JsonRequestBehavior { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException("Cette requête a été bloquée car des informations sensibles pourraient être divulguées à des sites web tiers lorsqu'elle est utilisée dans une requête GET. Pour autoriser les requêtes GET, définissez JsonRequestBehavior sur AllowGet.");
        }

        var response = context.HttpContext.Response;

        response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data == null)
            return;

        var jsonSerializerSettings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        response.Write(JsonConvert.SerializeObject(Data, jsonSerializerSettings));
    }
}

Utilisez ensuite cette classe comme suit dans votre méthode de contrôleur MVC :

public ActionResult GetPerson()
{
    return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)};
}

65voto

Assaf S. Points 41

Pour WebAPI, consultez ce lien : http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx

En gros, ajoutez ce code à votre Application_Start:

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();

45voto

Quantium Points 316

Je pense que c'est la réponse simple que vous cherchez. C'est du blog de Shawn Wildermuth :

// Ajouter les services MVC au conteneur de services.
services.AddMvc()
  .AddJsonOptions(opts =>
  {
    opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
  });

29voto

Watson Kaunda Points 21

Ajoutez la propriété NamingStrategy Json à la définition de votre classe.

[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X