Dove è finito IMvcBuilder AddJsonOptions in .Net Core 3.0?


119

Ho appena aggiornato il mio progetto API Web ASP da. Net core 2.0a 3.0. Stavo usando

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

in precedenza per garantire l'involucro inferiore del JSON serializzato.

Dopo l'aggiornamento a 3.0 ottengo questo errore:

Errore CS1061 'IMvcBuilder' non contiene una definizione per 'AddJsonOptions' e non è stato trovato alcun metodo di estensione accessibile 'AddJsonOptions' che accetta un primo argomento di tipo 'IMvcBuilder' (ti manca una direttiva using o un riferimento ad assembly?)

Secondo AddJsonOptions per MvcJsonOptions in Asp.Net Core 2.2, il metodo di estensione AddJsonOptions è / è stato fornito dal pacchetto nuget Microsoft.AspNetCore.Mvc.Formatters.Json . Ho provato a installarlo / reinstallarlo ma non riesco ancora a risolvere il metodo. È interessante notare che intellisense mostra solo Microsoft.AspNetCore.Mvc.Formatters. Xml quando provo ad aggiungere l'istruzione using anche se ho aggiunto il pacchetto Json nuget.

Qualche idea su cosa sta succedendo? La documentazione per AddJsonOptions arriva solo fino a .Net 2.2 quindi forse il metodo è stato deprecato nella 3.0 a favore di qualche altro meccanismo di configurazione?

Risposte:


203

Come parte di ASP.NET Core 3.0, il team ha abbandonato l'inclusione di Json.NET per impostazione predefinita. Puoi leggere ulteriori informazioni su questo in generale nell'annuncio sull'interruzione delle modifiche a Microsoft.AspNetCore.App .

Invece di Json.NET, ASP.NET Core 3.0 e .NET Core 3.0 includono un'API JSON diversa che si concentra maggiormente sulle prestazioni. Puoi saperne di più nell'annuncio su "Il futuro di JSON in .NET Core 3.0" .

I nuovi modelli per ASP.NET Core non saranno più inclusi in Json.NET ma puoi facilmente riconfigurare il progetto per usarlo al posto della nuova libreria JSON. Questo è importante sia per la compatibilità con i progetti precedenti sia perché la nuova libreria non dovrebbe essere una sostituzione completa, quindi non vedrai il set completo di funzionalità lì.

Per riconfigurare il progetto ASP.NET Core 3.0 con Json.NET, sarà necessario aggiungere un riferimento NuGet a Microsoft.AspNetCore.Mvc.NewtonsoftJson, che è il pacchetto che include tutti i bit necessari. Quindi, nelle Startup ConfigureServices, dovrai configurare MVC in questo modo:

services.AddControllers()
    .AddNewtonsoftJson();

Questo imposta i controller MVC e lo configura per utilizzare Json.NET invece di quella nuova API. Invece dei controller, puoi anche utilizzare un diverso overload MVC (ad esempio per i controller con viste o pagine Razor). Questo AddNewtonsoftJsonmetodo ha un sovraccarico che ti consente di configurare le opzioni Json.NET come eri abituato AddJsonOptionsin ASP.NET Core 2.x.

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

41
Per coloro che seguono a casa ... durante la migrazione di un progetto potrebbe essere necessario aggiungere un riferimento nuget a "Microsoft.AspNetCore.Mvc.NewtonsoftJson" per ottenere l'estensione "AddNewtonsoftJson". Al momento della stesura di questo documento, è necessario controllare "include prereleases" se si utilizza il gestore di Visual Studio Nuget.
NeilMacMullen

1
Si noti che in genere non consiglierei ancora la migrazione ad ASP.NET Core 3 con applicazioni reali. Se vuoi solo giocare, certo, ma ci sono ancora alcuni bit in movimento prima del rilascio finale, quindi dovrai tenerlo a mente se vuoi migrare ad esso in anticipo.
colpisci il

1
Questo può attivare "Le operazioni sincrone non sono consentite" controlla stackoverflow.com/questions/47735133/… per maggiori informazioni
verbedr

8
Per me AddNewtonsoftJsonmanca, anche dopo aver fatto riferimento a quel Microsoft.AspNetCore.Mvc.NewtonsoftJsonriferimento.
Saeed Neamati

2
@avenmore Il nuovo serializzatore utilizza un insieme separato di attributi. Puoi usare [JsonIgnore]dallo System.Text.Json.Serializationspazio dei nomi.
colpisci il

21

Questo ha funzionato per me, durante l'utilizzo .Net Core 3:

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

Presumo che la linea dovrebbe essere:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer

1
Sì anche a me, ma non è così. Questa risposta ha funzionato per me però.
Martin,

2
Non c'è bisogno di o.JsonSerializerOptions.DictionaryKeyPolicy = null;eo.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani

Vorrei poter usare questa risposta, ma la mia applicazione è stata creata utilizzando gli attributi Newtonsoft, che il nuovo serializzatore MS ignora, il che significa che devo continuare a utilizzare il serializzatore Newtonsoft con AddNewtonsoftJson. Forse MS potrebbe aggiungere un'opzione per rispettare gli attributi di Newtonsoft, pur ottenendo i miglioramenti delle prestazioni che promettono.
Eric,

@eric Sì, hai ragione, ma le prestazioni di Newtonsoft sono sufficienti per la maggior parte delle situazioni.
Mohammad Olfatmiri,

0

Questo aiuterebbe

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")));
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.