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?


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



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 ().


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;
        });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.