Come configurare le impostazioni del serializzatore json in asp.net core 3?


29

Le impostazioni del serializzatore json per le applicazioni core legacy asp.net sono state impostate aggiungendo AddMvc().AddJsonOptions(), ma non le uso AddMvc()in asp.net core 3. Quindi, come posso configurare le impostazioni di serializzazione json globali?


Se non si usa AddMvc, che cosa fare si usa? Stai usando ad esempio AddControllerso non stai usando affatto MVC?
Kirk Larkin,

@KirkLarkin utilizzo il modo predefinito di costruire l'app asp.net core 3 - app.UseEndpoints(endpoints => { endpoints.MapControllers() })eservices.AddControllers();
Alex Zaitsev,

Va bene, quindi credo che si sta utilizzando AddControllersin ConfigureServices, giusto?
Kirk Larkin,

@KirkLarkin, sì, giusto
Alex Zaitsev,

Risposte:


27

AddMvcrestituisce IMvcBuilderun'implementazione, che ha un AddJsonOptionsmetodo di estensione corrispondente . I metodi di nuovo stile AddControllers, AddControllersWithViewse AddRazorPagesrestituiscono anche IMvcBuilderun'implementazione. Incatenali con questi nello stesso modo in cui faresti con AddMvc:

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

Nota che optionsqui non è più per Json.NET, ma per le System.Text.JsonAPI più recenti . Se vuoi ancora usare Json.NET, vedi la risposta di tymtam



Aggiunta di "options.JsonSerializerOptions.IgnoreNullValues ​​= true;" non ha avuto effetto
zion

1
Ad altri che hanno visitato questa pagina in cerca di conversione Enum: [JsonConverter (typeof (JsonStringEnumConverter))] enum pubblico SomeEnum
Rafał Praniuk

23

Opzione A. AddController

Questo è ancora MVC e richiede il pacchetto nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, ma hai detto di usarlo AddControllers.

Da Aggiungi supporto formato JSON basato su 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());
});

Opzione B. Impostazioni predefinite

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

Proprietà JsonConvert.DefaultSettings

Ottiene o imposta una funzione che crea JsonSerializerSettings predefiniti. Le impostazioni predefinite vengono utilizzate automaticamente dai metodi di serializzazione su JsonConvert e ToObject () e FromObject (Object) su JToken. Per serializzare senza utilizzare le impostazioni predefinite, creare un JsonSerializer con Create ().


Ciao, questo imposta le impostazioni a livello Json.NET, come si può fare a livello ASP.NET?
Alex Zaitsev,

Configura le impostazioni a livello di ASP.NET, il che significa che ModelBinding predefinito ora avviene utilizzando il serializzatore NewtonsoftJson.
MrClan

Grazie, l'opzione A ha funzionato per me. Aggiornato da 2.2 a 3.1 e il mio endpoint si è rotto perché System.Text.Jsonnon gestisce correttamente il polimorfismo o gli enum. Bel modo semplice per modificare il serializzatore predefinito.
static_void

15

L'aggiunta di Newtonsoft non è necessaria, piuttosto un problema con l'aggiunta di pacchetti di compatibilità Newtonsoft sul progetto .Net Core 3.0.

Vedi anche https://github.com/aspnet/AspNetCore/issues/13564

Certo, si potrebbe celebrare il nome della proprietà PascalCase, NA al momento ... Quindi nullper PropertyNamingPolicydire PascalCase, che ovviamente non è molto buono.

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.