Les propriétés JSON sont désormais en minuscules lors de l'échange d'ASP .Net Core 1.0.0-rc2-final vers 1.0.0

90

Je viens de remplacer notre projet ASP .Net Core 1.0.0-rc2-final par 1.0.0. Notre site Web et notre client ont cessé de fonctionner en raison 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++){

car le contrôleur appelle maintenant le tableau "items" au lieu de "Items". Je n'ai apporté aucune modification au-delà de l'installation des packages mis à jour et de la modification du fichier project.json. Je n'ai pas changé les fichiers de modèle C # qui capitalisent toujours leurs propriétés.

Pourquoi les contrôleurs ASP.Net Core ont-ils commencé à renvoyer JSON avec des propriétés minuscules? Comment puis-je revenir à eux en respectant la casse des noms de propriété du modèle?

dumbledad
la source
2
Pour ceux d'entre vous qui recherchent la réponse pour .Net Core 3, vous devez faire défiler vers le bas de la page.
Mike Devenney

Réponses:

157

MVC sérialise désormais JSON avec des noms de cas de chameau par défaut

Utilisez ce code pour éviter les noms de cas de chameau par défaut

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

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

Oleksandr Fentsyk
la source
8
netcore2: utilisation de Newtonsoft.Json.Serialization;
david.barkhuizen
3
Je ne veux pas changer toute ma sérialisation JSON, juste un cas particulier qui doit correspondre au comportement de certains logiciels tiers. Comment fournir les paramètres de sérialisation corrects dans le deuxième paramètre de l' Json()appel?
Auspex
79

Au cas où vous auriez trouvé cela de Google et que vous recherchiez une solution pour Core 3.

Core 3 utilise System.Text.Json, qui par défaut ne préserve pas la casse. Comme mentionné avec ce problème GitHub , définir le PropertyNamingPolicysur null résoudra le problème.

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

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

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });
Ron Rebennack
la source
8
tu es mon seigneur et sauveur
Jonty Morris le
1
Cela a bien fonctionné pour moi sur Core 3.1. Je n'ai pas pu faire fonctionner correctement mes composants kendo et j'ai trouvé que le json était formaté en étui camel. Cela a résolu le problème.
Waragi
Je suis aussi votre sujet
João Loureiro
9

Pour ceux qui ont migré vers Core 3.1 et ont un projet Core MVC, vous pouvez utiliser le code d'installation suivant dans Startup.cs:


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }
UY
la source
C'est la même chose qu'une réponse précédente stackoverflow.com/a/58187836/125981
Mark Schultheiss le
@MarkSchultheiss vous avez probablement raison, car ma réponse est similaire à toutes les autres, cependant, lorsque je cherchais la bonne réponse en fonction de mon type de projet, qui est MVC utilisant des vues, je n'ai pas trouvé de réponse exacte correspondant à mon projet. AddControllersWithViews () ajoute ces pièces manquantes, et j'ai pensé que cela serait utile à n'importe qui dans le futur. Merci pour votre commentaire!
UY le
3

Cela le corrigera dans dotnet core 3 webapi, afin qu'il ne change pas du tout les noms de vos propriétés et que vous retourniez à votre client exactement ce que vous vouliez.

Dans Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }
RouterBox
la source
C'est la même chose qu'une réponse précédente stackoverflow.com/a/58187836/125981
Mark Schultheiss le
1

Pour quelqu'un qui utilise l'API WEB ASP.net (plutôt que ASP.NET Core).

Ajoutez cette ligne dans votre WebApiConfig.

//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

L'ajout de ceci comme réponse ici, car cela apparaît également en premier dans la recherche Google pour l'API Web.

Abdul Rehman Sayed
la source
0

Pour les versions Core 2.x, en utilisant ce code, vous pouvez éviter les noms de cas de camel par défaut. Vous devez ajouter le code suivant dans la méthode ConfigureServices du fichier Startup.cs.

services.AddMvc()
.AddJsonOptions(o =>
{
    if (o.SerializerSettings.ContractResolver != null)
    {
        var castedResolver = o.SerializerSettings.ContractResolver
        as DefaultContractResolver;

        castedResolver.NamingStrategy = null;
    }
});
Asiri Jayaweera
la source