Gdzie poszedł IMvcBuilder AddJsonOptions w .Net Core 3.0?

119

Właśnie zaktualizowałem mój projekt interfejsu API sieci Web ASP z. Net core 2.0do 3.0. Używałem

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

poprzednio, aby zapewnić mniejsze wielkości liter w serializowanym formacie JSON.

Po aktualizacji do 3.0 pojawia się ten błąd:

Błąd CS1061 „IMvcBuilder” nie zawiera definicji „AddJsonOptions” i nie można znaleźć żadnej dostępnej metody rozszerzenia „AddJsonOptions” akceptującej pierwszy argument typu „IMvcBuilder” (czy brakuje dyrektywy using lub odwołania do zestawu?)

Zgodnie z AddJsonOptions dla MvcJsonOptions w Asp.Net Core 2.2 metoda rozszerzenia AddJsonOptions jest / została dostarczona przez pakiet NuGet Microsoft.AspNetCore.Mvc.Formatters.Json . Próbowałem zainstalować / ponownie zainstalować to, ale nadal nie mogę rozwiązać metody. Co ciekawe, funkcja Intellisense wyświetla tylko Microsoft.AspNetCore.Mvc.Formatters. XML, gdy próbuję dodać instrukcję using, mimo że dodałem pakiet Json nuget.

Jakieś pomysły, co się dzieje? Dokumentacja dla AddJsonOptions idzie tylko do .NET 2.2, więc może metoda została zaniechana w 3,0 na korzyść innego mechanizmu konfiguracyjnego?

NeilMacMullen
źródło

Odpowiedzi:

203

W ramach ASP.NET Core 3,0 zespół odszedł od domyślnego uwzględniania Json.NET. Możesz przeczytać więcej na ten temat ogólnie w ogłoszeniu o istotnych zmianach w Microsoft.AspNetCore.App .

Zamiast Json.NET, ASP.NET Core 3.0 i .NET Core 3.0 zawierają inny interfejs API JSON, który koncentruje się nieco bardziej na wydajności. Więcej informacji na ten temat można znaleźć w komunikacie „Przyszłość formatu JSON w .NET Core 3.0” .

Nowe szablony dla ASP.NET Core nie będą już dołączane do Json.NET, ale można łatwo zmienić konfigurację projektu, aby używać go zamiast nowej biblioteki JSON. Jest to ważne zarówno ze względu na kompatybilność ze starszymi projektami, jak i dlatego, że nowa biblioteka nie ma być pełnym zamiennikiem, więc nie zobaczysz tam pełnego zestawu funkcji.

Aby ponownie skonfigurować projekt ASP.NET Core 3,0 za pomocą Json.NET, musisz dodać odwołanie NuGet do Microsoft.AspNetCore.Mvc.NewtonsoftJsonpakietu zawierającego wszystkie niezbędne bity. Następnie w Startup'ach ConfigureServicesbędziesz musiał skonfigurować MVC w następujący sposób:

services.AddControllers()
    .AddNewtonsoftJson();

Spowoduje to skonfigurowanie kontrolerów MVC i skonfigurowanie go do używania Json.NET zamiast tego nowego interfejsu API. Zamiast kontrolerów można również użyć innego przeciążenia MVC (np. Dla kontrolerów z widokami lub stron Razor). Ta AddNewtonsoftJsonmetoda ma przeciążenie, które umożliwia skonfigurowanie opcji Json.NET, takich jak AddJsonOptionsw przypadku ASP.NET Core 2.x.

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });
szturchać
źródło
41
W przypadku osób śledzących w domu ... podczas migracji projektu może być konieczne dodanie odwołania nuget do „Microsoft.AspNetCore.Mvc.NewtonsoftJson”, aby uzyskać rozszerzenie „AddNewtonsoftJson”. W chwili pisania tego tekstu wymaga to zaznaczenia opcji „uwzględnij wersje wstępne”, jeśli używasz menedżera Visual Studio Nuget.
NeilMacMullen
1
Zauważ, że generalnie nie polecam jeszcze migracji do ASP.NET Core 3 z prawdziwymi aplikacjami. Jeśli chcesz się po prostu pobawić, jasne, ale przed ostatecznym wydaniem jest jeszcze kilka ruchomych fragmentów, więc będziesz musiał o tym pamiętać, jeśli chcesz migrować do niego wcześniej.
szturchnij
1
Może to wywołać komunikat „Operacje synchroniczne są niedozwolone”, sprawdź stackoverflow.com/questions/47735133/… aby uzyskać więcej informacji
verbedr
8
Dla mnie AddNewtonsoftJsonbrakuje, nawet po odwołaniu się do tego Microsoft.AspNetCore.Mvc.NewtonsoftJsonodniesienia.
Saeed Neamati
2
@avenmore Nowy serializator używa oddzielnego zestawu atrybutów. Możesz użyć [JsonIgnore]z System.Text.Json.Serializationprzestrzeni nazw.
poke
21

To zadziałało dla mnie, podczas używania .Net Core 3:

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});
Mohammad Olfatmiri
źródło
Zakładam, że linia powinna wyglądać następująco:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer
1
Tak, ja też, ale tak nie jest. Ta odpowiedź zadziałała jednak dla mnie.
Martin
2
Nie ma potrzeby o.JsonSerializerOptions.DictionaryKeyPolicy = null;io.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani
Chciałbym móc użyć tej odpowiedzi, ale moja aplikacja została zbudowana przy użyciu atrybutów Newtonsoft, które nowy serializator MS ignoruje, co oznacza, że ​​muszę nadal używać serializatora Newtonsoft z AddNewtonsoftJson. Być może MS mógłby dodać opcję uszanowania atrybutów Newtonsoft, jednocześnie uzyskując obiecany wzrost wydajności.
Eric
@eric Tak, masz rację, ale wydajność Newtonsoft jest wystarczająca w większości sytuacji.
Mohammad Olfatmiri
0

To by pomogło

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")));
        }
Nirmala
źródło