Wohin ging IMvcBuilder AddJsonOptions in .Net Core 3.0?


119

Ich habe gerade mein ASP-Web-API-Projekt von aktualisiert. Net core 2.0zu 3.0. Ich habe benutzt

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

zuvor, um das untere Gehäuse des serialisierten JSON sicherzustellen.

Nach dem Upgrade auf 3.0 erhalte ich folgende Fehlermeldung:

Fehler CS1061 'IMvcBuilder' enthält keine Definition für 'AddJsonOptions' und es konnte keine zugängliche Erweiterungsmethode 'AddJsonOptions' gefunden werden, die ein erstes Argument vom Typ 'IMvcBuilder' akzeptiert (fehlt Ihnen eine using-Direktive oder eine Assemblyreferenz?)

Gemäß AddJsonOptions für MvcJsonOptions in Asp.Net Core 2.2 wird / wurde die AddJsonOptions-Erweiterungsmethode vom Microsoft.AspNetCore.Mvc.Formatters.Json- Nuget-Paket bereitgestellt. Ich habe versucht, dies zu installieren / neu zu installieren, kann die Methode jedoch immer noch nicht auflösen. Interessanterweise zeigt Intellisense nur Microsoft.AspNetCore.Mvc.Formatters an. XML, wenn ich versuche, die using-Anweisung hinzuzufügen, obwohl ich das Json- Nuget-Paket hinzugefügt habe.

Irgendwelche Ideen, was los ist? Die Dokumentation für AddJsonOptions reicht nur bis zu .Net 2.2. Vielleicht wurde die Methode in 3.0 zugunsten eines anderen Konfigurationsmechanismus veraltet.

Antworten:


203

Als Teil von ASP.NET Core 3.0 hat das Team standardmäßig Json.NET nicht mehr aufgenommen. Weitere Informationen hierzu finden Sie im Allgemeinen in der Ankündigung, Änderungen an Microsoft.AspNetCore.App zu ändern .

Anstelle von Json.NET enthalten ASP.NET Core 3.0 und .NET Core 3.0 eine andere JSON-API, die sich etwas mehr auf die Leistung konzentriert. Weitere Informationen hierzu finden Sie in der Ankündigung „Die Zukunft von JSON in .NET Core 3.0“ .

Die neuen Vorlagen für ASP.NET Core werden nicht mehr mit Json.NET gebündelt, aber Sie können das Projekt einfach neu konfigurieren, um es anstelle der neuen JSON-Bibliothek zu verwenden. Dies ist sowohl für die Kompatibilität mit älteren Projekten als auch wichtig, da die neue Bibliothek kein vollständiger Ersatz sein soll, sodass dort nicht alle Funktionen angezeigt werden.

Um Ihr ASP.NET Core 3.0-Projekt mit Json.NET neu zu konfigurieren, müssen Sie einen NuGet-Verweis auf Microsoft.AspNetCore.Mvc.NewtonsoftJsondas Paket hinzufügen , das alle erforderlichen Bits enthält. Dann müssen Sie in den Startups ConfigureServicesMVC wie folgt konfigurieren:

services.AddControllers()
    .AddNewtonsoftJson();

Dadurch werden MVC-Controller eingerichtet und so konfiguriert, dass Json.NET anstelle dieser neuen API verwendet wird. Anstelle von Controllern können Sie auch eine andere MVC-Überlastung verwenden (z. B. für Controller mit Ansichten oder Razor-Seiten). Diese AddNewtonsoftJsonMethode weist eine Überlastung auf, mit der Sie die Json.NET-Optionen so konfigurieren können, wie Sie es AddJsonOptionsin ASP.NET Core 2.x gewohnt waren .

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

41
Für diejenigen, die zu Hause mitmachen ... Wenn Sie ein Projekt migrieren, müssen Sie möglicherweise einen Nuget-Verweis auf "Microsoft.AspNetCore.Mvc.NewtonsoftJson" hinzufügen, um die Erweiterung "AddNewtonsoftJson" zu erhalten. Zum Zeitpunkt des Schreibens muss "Vorabversionen einschließen" überprüft werden, wenn Sie den Visual Studio Nuget-Manager verwenden.
NeilMacMullen

1
Beachten Sie, dass ich die Migration auf ASP.NET Core 3 mit echten Anwendungen im Allgemeinen noch nicht empfehlen würde. Wenn Sie nur herumspielen möchten, aber vor der endgültigen Veröffentlichung noch ein paar bewegende Teile vorhanden sind, müssen Sie dies berücksichtigen, wenn Sie frühzeitig darauf migrieren möchten.
stupsen

1
Dies kann Trigger - Check „Synchrone Operationen werden nicht zugelassen“ stackoverflow.com/questions/47735133/... für weitere Informationen
verbedr

8
Für mich AddNewtonsoftJsonfehlt auch nach Bezugnahme auf diese Microsoft.AspNetCore.Mvc.NewtonsoftJsonReferenz.
Saeed Neamati

2
@avenmore Der neue Serializer verwendet einen separaten Satz von Attributen. Sie können [JsonIgnore]aus dem System.Text.Json.SerializationNamespace verwenden.
Poke

21

Dies funktionierte bei mir bei der Verwendung von .Net Core 3:

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

Ich würde annehmen, dass die Linie sein sollte:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer

1
Ja ich auch, aber das tut es nicht. Diese Antwort hat bei mir funktioniert.
Martin

2
Keine Notwendigkeit für o.JsonSerializerOptions.DictionaryKeyPolicy = null;undo.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani

Ich wünschte, ich könnte diese Antwort verwenden, aber meine Anwendung wurde mit Newtonsoft-Attributen erstellt, die vom neuen MS-Serializer ignoriert werden. Dies bedeutet, dass ich den Newtonsoft-Serializer weiterhin mit AddNewtonsoftJson verwenden muss. Vielleicht könnte MS eine Option hinzufügen, um die Newtonsoft-Attribute zu respektieren und gleichzeitig die vielversprechenden Leistungssteigerungen zu erzielen.
Eric

@eric Ja, Sie haben Recht, aber die Leistung von Newtonsoft reicht für die meisten Situationen aus.
Mohammad Olfatmiri

0

Das würde helfen

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")));
        }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.