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?


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



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.


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;
        });
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.