Où IMvcBuilder AddJsonOptions est-il allé dans .Net Core 3.0?


119

Je viens de mettre à niveau mon projet d'API Web ASP à partir de. Net core 2.0à 3.0. J'utilisais

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

précédemment pour garantir la casse inférieure du JSON sérialisé.

Après la mise à niveau vers 3.0, j'obtiens cette erreur:

L'erreur CS1061 'IMvcBuilder' ne contient pas de définition pour 'AddJsonOptions' et aucune méthode d'extension accessible 'AddJsonOptions' acceptant un premier argument de type 'IMvcBuilder' n'a pu être trouvée (vous manquez une directive using ou une référence d'assembly?)

Selon AddJsonOptions pour MvcJsonOptions dans Asp.Net Core 2.2, la méthode d'extension AddJsonOptions est / a été fournie par le package nuget Microsoft.AspNetCore.Mvc.Formatters.Json . J'ai essayé d'installer / réinstaller ceci mais je n'arrive toujours pas à résoudre la méthode. Fait intéressant, intellisense n'affiche que les Microsoft.AspNetCore.Mvc.Formatters. Xml lorsque j'essaie d'ajouter l'instruction using même si j'ai ajouté le package Json nuget.

Une idée de ce qui se passe? La documentation pour AddJsonOptions ne remonte qu'à .Net 2.2, donc peut-être que la méthode a été déconseillée dans la version 3.0 au profit d'un autre mécanisme de configuration?

Réponses:


203

Dans le cadre d'ASP.NET Core 3.0, l'équipe a abandonné l'inclusion de Json.NET par défaut. Vous pouvez en savoir plus à ce sujet en général dans l' annonce des modifications radicales apportées à Microsoft.AspNetCore.App .

Au lieu de Json.NET, ASP.NET Core 3.0 et .NET Core 3.0 incluent une API JSON différente qui se concentre un peu plus sur les performances. Pour en savoir plus, consultez l' annonce sur «L'avenir de JSON dans .NET Core 3.0» .

Les nouveaux modèles pour ASP.NET Core ne seront plus regroupés avec Json.NET, mais vous pouvez facilement reconfigurer le projet pour l'utiliser à la place de la nouvelle bibliothèque JSON. Ceci est important à la fois pour la compatibilité avec les projets plus anciens et aussi parce que la nouvelle bibliothèque n'est pas censée être un remplacement complet, vous ne verrez donc pas l'ensemble des fonctionnalités complètes.

Pour reconfigurer votre projet ASP.NET Core 3.0 avec Json.NET, vous devrez ajouter une référence NuGet à Microsoft.AspNetCore.Mvc.NewtonsoftJson, qui est le package qui comprend tous les bits nécessaires. Ensuite, dans le Startup ConfigureServices, vous devrez configurer MVC comme ceci:

services.AddControllers()
    .AddNewtonsoftJson();

Cela configure les contrôleurs MVC et le configure pour utiliser Json.NET au lieu de cette nouvelle API. Au lieu de contrôleurs, vous pouvez également utiliser une autre surcharge MVC (par exemple pour les contrôleurs avec vues ou pages Razor). Cette AddNewtonsoftJsonméthode a une surcharge qui vous permet de configurer les options Json.NET comme vous en aviez l'habitude AddJsonOptionsdans ASP.NET Core 2.x.

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

41
Pour ceux qui suivent à la maison ... lors de la migration d'un projet, vous devrez peut-être ajouter une référence nuget à "Microsoft.AspNetCore.Mvc.NewtonsoftJson" pour obtenir l'extension "AddNewtonsoftJson". Au moment de la rédaction de cet article, la case à cocher "Inclure les versions préliminaires" est requise si vous utilisez le gestionnaire Visual Studio Nuget.
NeilMacMullen

1
Notez que je ne recommanderais généralement pas de migrer vers ASP.NET Core 3 avec de vraies applications pour le moment. Si vous voulez juste jouer, bien sûr, mais il reste encore quelques éléments en mouvement avant la version finale, vous devrez donc garder cela à l'esprit si vous souhaitez y migrer tôt.
poke le

1
Cela peut déclencher "Les opérations synchrones sont interdites", vérifiez stackoverflow.com/questions/47735133/... pour plus d'informations
verbedr

8
Pour moi AddNewtonsoftJson, il manque, même après avoir référencé cette Microsoft.AspNetCore.Mvc.NewtonsoftJsonréférence.
Saeed Neamati

2
@avenmore Le nouveau sérialiseur utilise un ensemble distinct d'attributs. Vous pouvez utiliser à [JsonIgnore]partir de l' System.Text.Json.Serializationespace de noms.
poke

21

Cela a fonctionné pour moi, tout en utilisant .Net Core 3:

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});

Je suppose que la ligne devrait être:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer

1
Ouais moi aussi, mais ce n'est pas le cas. Cette réponse a fonctionné pour moi cependant.
Martin

2
Pas besoin de o.JsonSerializerOptions.DictionaryKeyPolicy = null;eto.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani

J'aimerais pouvoir utiliser cette réponse, mais mon application a été construite en utilisant les attributs Newtonsoft, que le nouveau sérialiseur MS ignore, ce qui signifie que je dois continuer à utiliser le sérialiseur Newtonsoft avec AddNewtonsoftJson. Peut-être que MS pourrait ajouter une option pour respecter les attributs Newtonsoft, tout en obtenant les gains de performances qu'ils promettent.
Eric le

@eric Oui, vous avez raison, mais les performances de Newtonsoft sont suffisantes pour la plupart des situations.
Mohammad Olfatmiri

0

Cela aiderait

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

            });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));
        }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.