116 votes

Les propriétés JSON sont désormais en minuscules lors du passage d'ASP .Net Core 1.0.0-rc2-final à 1.0.0

Je viens de faire passer notre projet d'ASP .Net Core 1.0.0-rc2-final à 1.0.0. Notre site web et notre client ont cessé de fonctionner à cause de la capitalisation des propriétés JSON. Par exemple, cette ligne de JavaScript échoue maintenant

for (var i = 0; i < collection.Items.length; i++){

parce que le contrôleur appelle maintenant le tableau "items" au lieu de "Items". Je n'ai fait aucun changement, si ce n'est installer les paquets mis à jour et modifier le fichier project.json. Je n'ai pas modifié les fichiers de modèle C# qui continuent à mettre en valeur leurs propriétés.

Pourquoi les contrôleurs ASP.Net Core ont-ils commencé à renvoyer du JSON avec des propriétés en minuscules ? Comment faire pour qu'ils respectent à nouveau la casse des noms de propriétés du modèle ?

0 votes

4 votes

Pour ceux d'entre vous qui cherchent la réponse pour .Net Core 3, vous devez faire défiler la page jusqu'au bas de la page.

172voto

Sasha Fencyk Points 745

MVC sérialise désormais JSON avec des noms en majuscules par défaut.

Utilisez ce code pour éviter les noms en majuscules par défaut.

  services.AddMvc()
        .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

Source : https://github.com/aspnet/Announcements/issues/194

8 votes

Netcore2 : utilisation de Newtonsoft.Json.Serialization ;

4 votes

Je ne veux pas changer tous de ma sérialisation JSON, juste un cas particulier qui doit correspondre au comportement d'un logiciel tiers. Comment fournir les paramètres de sérialisation corrects dans le second paramètre de l'instruction Json() appeler ?

138voto

Ron Rebennack Points 21

Si vous avez trouvé ceci sur Google et que vous cherchez une solution pour Core 3.

Core 3 utilise System.Text.Json qui, par défaut, ne préserve pas le cas. Comme mentionné avec ce Numéro de GitHub en fixant le PropertyNamingPolicy à null va régler le problème.

public void ConfigureServices(IServiceCollection services)
{
...
    services.AddControllers()
            .AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);

et si vous ne voulez pas changer les paramètres globaux, pour une seule action, c'est comme ça :

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });

19voto

Joe Audette Points 15293

Vous pouvez modifier le comportement comme suit :

services
    .AddMvc()
    .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

Voir l'annonce ici : https://github.com/aspnet/Announcements/issues/194

12voto

U.Y. Points 449

Pour ceux qui ont migré vers Core 3.1 et ont un projet Core MVC, ils peuvent utiliser le code de configuration suivant dans Startup.cs :


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }

5voto

infografnet Points 385

Pour quelqu'un qui ne veut pas le définir globalement, il est possible d'utiliser ContractResolver également pour retourner un résultat en Json :

public IActionResult MyMethod()
{
    var obj = new {myValue = 1};
    return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()});
}

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