Como definir as configurações do json serializer no asp.net core 3?

29

configurações serializador JSON para aplicativos principais legado asp.net foram criados pela adição AddMvc().AddJsonOptions(), mas eu não uso AddMvc()em asp.net core 3. Então, como posso definir configurações globais de serialização do json?

Alex Zaitsev
fonte
Se você não usa AddMvc, o que você usa? Você está usando, por exemplo, AddControllersou simplesmente não está usando o MVC?
Kirk Larkin
@KirkLarkin eu uso a maneira padrão de criar o aplicativo asp.net core 3 - app.UseEndpoints(endpoints => { endpoints.MapControllers() })eservices.AddControllers();
Alex Zaitsev
Tudo bem, então eu acho que você está usando AddControllersem ConfigureServices, certo?
Kirk Larkin
@KirkLarkin, sim, certo #
Alex Zaitsev

Respostas:

27

AddMvcretorna uma IMvcBuilderimplementação, que possui um AddJsonOptionsmétodo de extensão correspondente . Os métodos de estilo novo AddControllers, AddControllersWithViewse AddRazorPagestambém retornar uma IMvcBuilderimplementação. Acorrente-os da mesma maneira que acorrentaria AddMvc:

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

Observe que optionsaqui não é mais para o Json.NET, mas para as System.Text.JsonAPIs mais recentes . Se você ainda deseja usar o Json.NET, consulte a resposta do tymtam

Kirk Larkin
fonte
Adicionando "options.JsonSerializerOptions.IgnoreNullValues ​​= true;" não teve efeito
zion
11
Para outras pessoas que acessaram esta página procurando a conversão de Enum: [JsonConverter (typeof (JsonStringEnumConverter))] enumeração pública SomeEnum
Rafał Praniuk
23

Opção A. AddControllers

Esse ainda é o MVC e requer o pacote de nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, mas você disse que o usa AddControllers.

De suporte ao formato JSON-based Newtonsoft.Json Add

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

Opção B. DefaultSettings

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

Propriedade JsonConvert.DefaultSettings

Obtém ou define uma função que cria JsonSerializerSettings padrão. As configurações padrão são usadas automaticamente pelos métodos de serialização no JsonConvert e ToObject () e FromObject (Object) no JToken. Para serializar sem usar nenhuma configuração padrão, crie um JsonSerializer com Create ().

timtim
fonte
Oi, isso define configurações no nível do Json.NET, como isso pode ser feito no nível do ASP.NET?
Alex Zaitsev
Ele define as configurações no nível do ASP.NET, o que significa que ModelBinding padrão agora acontece usando o serializador NewtonsoftJson.
MrClan 11/03
Obrigado, a opção A funcionou para mim. Atualizei de 2.2 para 3.1 e meu endpoint quebrou porque System.Text.Jsonnão lida com polimorfismo ou enumeração corretamente. Maneira fácil e agradável de alterar o serializador padrão.
static_void 14/04
15

Não é necessário adicionar o Newtonsoft, é um grande problema adicionar os pacotes de compatibilidade do Newtonsoft no projeto .Net Core 3.0.

Consulte também https://github.com/aspnet/AspNetCore/issues/13564

Claro, pode-se celebrar nomeação propriedade PascalCase, NA no momento ... Então, nullpor PropertyNamingPolicymeio PascalCase, o que não é, obviamente, muito bom.

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