Wie stelle ich die Einstellungen für den JSON-Serializer in asp.net Core 3 ein?

29

Die JSON-Serializer-Einstellungen für ältere asp.net-Kernanwendungen wurden durch Hinzufügen festgelegt AddMvc().AddJsonOptions(), ich verwende sie jedoch nicht AddMvc()in asp.net core 3. Wie kann ich globale JSON-Serialisierungseinstellungen festlegen?

Alex Zaitsev
quelle
Wenn Sie nicht verwenden AddMvc, was verwenden Sie? Verwenden Sie zB AddControllersoder verwenden Sie MVC überhaupt nicht?
Kirk Larkin
@ KirkLarkin Ich benutze die Standardmethode zum Erstellen der asp.net Core 3 App - app.UseEndpoints(endpoints => { endpoints.MapControllers() })undservices.AddControllers();
Alex Zaitsev
Okay, also ich denke du verwendest AddControllersin ConfigureServices, richtig?
Kirk Larkin
@ KirkLarkin, ja, richtig
Alex Zaitsev

Antworten:

27

AddMvcGibt eine IMvcBuilderImplementierung zurück, die über eine entsprechende AddJsonOptionsErweiterungsmethode verfügt. Die neue Stil Methoden AddControllers, AddControllersWithViewsund AddRazorPagesauch eine Rückkehr IMvcBuilderUmsetzung. Verketten Sie mit diesen auf die gleiche Weise, mit der Sie verketten würden AddMvc:

services.AddControllers()
    .AddJsonOptions(options =>
    {
        // ...
    });

Beachten Sie, dass dies optionsnicht mehr für Json.NET gilt, sondern für die neueren System.Text.JsonAPIs. Wenn Sie Json.NET weiterhin verwenden möchten, lesen Sie die Antwort von tymtam

Kirk Larkin
quelle
Hinzufügen von "options.JsonSerializerOptions.IgnoreNullValues ​​= true;" hatte keine Wirkung
Zion
1
An andere, die auf dieser Seite nach Enum-Konvertierung suchen: [JsonConverter (typeof (JsonStringEnumConverter))] public enum SomeEnum
Rafał Praniuk
23

Option A. AddController

Dies ist immer noch MVC und erfordert das Microsoft.AspNetCore.Mvc.NewtonsoftJson-Nuget-Paket, aber Sie sagten, dass Sie es verwenden AddControllers.

Von Unterstützung für das Hinzufügen des Newtonsoft.Json-basierten JSON-Formats

services.AddControllers().AddNewtonsoftJson(options =>
{
    // Use the default property (Pascal) casing
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();

    // Configure a custom converter
    options.SerializerOptions.Converters.Add(new MyCustomJsonConverter());
});

Option B. Standardeinstellungen

JsonConvert.DefaultSettings = () => new JsonSerializerSettings (...)

JsonConvert.DefaultSettings-Eigenschaft

Ruft eine Funktion ab oder legt diese fest, mit der Standard-JsonSerializerSettings erstellt werden. Die Standardeinstellungen werden automatisch von den Serialisierungsmethoden in JsonConvert und von ToObject () und FromObject (Object) in JToken verwendet. Um ohne Standardeinstellungen zu serialisieren, erstellen Sie mit Create () einen JsonSerializer.

Tymtam
quelle
Hallo, hiermit werden Einstellungen auf Json.NET-Ebene festgelegt. Wie kann dies auf ASP.NET-Ebene erfolgen?
Alex Zaitsev
Es konfiguriert die Einstellungen auf ASP.NET-Ebene, was bedeutet, dass die Standardmodellbindung jetzt mit dem NewtonsoftJson-Serializer erfolgt.
MrClan
Vielen Dank, Option A hat für mich funktioniert. Von 2.2 auf 3.1 System.Text.Jsonaktualisiert und mein Endpunkt ist kaputt gegangen, weil Polymorphismus oder Aufzählungen nicht richtig gehandhabt werden. Schöne einfache Möglichkeit, den Standard-Serializer zu ändern.
static_void
15

Das Hinzufügen von Newtonsoft ist nicht erforderlich. Dies ist ein Problem beim Hinzufügen von Newtonsoft-Kompatibilitätspaketen für das .Net Core 3.0-Projekt.

Siehe auch https://github.com/aspnet/AspNetCore/issues/13564

Natürlich wäre eine Eigenschaft Namensgebung feiern PascalCase, NA im Moment ... Also nullfür PropertyNamingPolicyMittel Pascal, was natürlich nicht sehr gut ist.

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
OSP
quelle