Jak ustawić ustawienia serializatora json w asp.net core 3?

29

json ustawienia serializer dla podstawowych zastosowań Legacy asp.net zostały ustalone poprzez dodanie AddMvc().AddJsonOptions(), ale nie używam AddMvc()w asp.net core 3. Jak więc ustawić globalne ustawienia serializacji Json?

Alex Zaitsev
źródło
Jeśli nie używasz AddMvc, co zrobić używasz? Czy używasz np. Czy AddControllersw ogóle nie używasz MVC?
Kirk Larkin
@KirkLarkin używam domyślnego sposobu budowania aplikacji asp.net core 3 - app.UseEndpoints(endpoints => { endpoints.MapControllers() })iservices.AddControllers();
Alex Zaitsev
W porządku, więc myślę, że używasz AddControllersw ConfigureServices, prawda?
Kirk Larkin
@KirkLarkin, tak, racja
Alex Zaitsev

Odpowiedzi:

27

AddMvczwraca IMvcBuilderimplementację, która ma odpowiednią AddJsonOptionsmetodę rozszerzenia. Metody new-style AddControllers, AddControllersWithViewsi AddRazorPagesrównież zwrócić IMvcBuilderrealizację. Połącz je w taki sam sposób, jak w przypadku AddMvc:

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

Pamiętaj, że optionsnie dotyczy to już Json.NET, ale nowszych System.Text.Jsoninterfejsów API. Jeśli nadal chcesz korzystać z Json.NET, zobacz odpowiedź tymtama

Kirk Larkin
źródło
Dodanie „options.JsonSerializerOptions.IgnoreNullValues ​​= true;” nie miało wpływu
zion
1
Do innych, którzy odwiedzili tę stronę w poszukiwaniu konwersji Enum: [JsonConverter (typeof (JsonStringEnumConverter))] enum publiczne SomeEnum
Rafał Praniuk
23

Opcja A. AddControllers

To wciąż jest MVC i wymaga pakietu nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, ale powiedziałeś, że używasz AddControllers.

Od Dodaj obsługę formatu JSON opartego na Newtonsoft.Json

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

Opcja B. Ustawienia domyślne

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

JsonConvert.DefaultSettings Właściwość

Pobiera lub ustawia funkcję, która tworzy domyślne JsonSerializerSettings. Ustawienia domyślne są automatycznie używane przez metody serializacji w JsonConvert oraz ToObject () i FromObject (Object) w JToken. Aby serializować bez użycia ustawień domyślnych, utwórz JsonSerializer za pomocą Create ().

tymtam
źródło
Cześć, to ustawia ustawienia na poziomie Json.NET, jak można to zrobić na poziomie ASP.NET?
Alex Zaitsev
Konfiguruje ustawienia na poziomie ASP.NET, co oznacza, że ​​domyślne ModelBinding odbywa się teraz przy użyciu serializatora NewtonsoftJson.
MrClan
Dziękuję, opcja A działała dla mnie. Uaktualniono z 2.2 do 3.1, a mój punkt końcowy zepsuł się, ponieważ System.Text.Jsonnie obsługuje poprawnie polimorfizmu lub wyliczeń. Fajny prosty sposób na zmianę domyślnego serializatora.
static_void
15

Dodanie Newtonsoft nie jest konieczne, dość problemy z dodaniem pakietów kompatybilności Newtonsoft w projekcie .Net Core 3.0.

Zobacz także https://github.com/aspnet/AspNetCore/issues/13564

Oczywiście, PascalCasew tej chwili należałoby świętować nazewnictwo nieruchomości , NA ... Więc nullna przykład PropertyNamingPolicyPascalCase, co oczywiście nie jest zbyt dobre.

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
OSP
źródło