Onde IMvcBuilder AddJsonOptions foi no .Net Core 3.0?


119

Acabei de atualizar meu projeto ASP Web API do. Net core 2.0a 3.0. Eu estava usando

     services.AddMvc()
             .AddJsonOptions(options =>options.SerializerSettings.ContractResolver 
                                       = new DefaultContractResolver());

anteriormente para garantir letras minúsculas do JSON serializado.

Após a atualização para 3.0, recebo este erro:

Erro CS1061 'IMvcBuilder' não contém uma definição para 'AddJsonOptions' e nenhum método de extensão acessível 'AddJsonOptions' aceitando um primeiro argumento do tipo 'IMvcBuilder' pôde ser encontrado (está faltando uma diretiva using ou uma referência de assembly?)

De acordo com AddJsonOptions para MvcJsonOptions no Asp.Net Core 2.2, o método de extensão AddJsonOptions é / foi fornecido pelo pacote nuget Microsoft.AspNetCore.Mvc.Formatters.Json . Tentei instalar / reinstalar isso, mas ainda não consigo resolver o método. Curiosamente, o intellisense mostra apenas Microsoft.AspNetCore.Mvc.Formatters. Xml quando tento adicionar a instrução using, embora tenha adicionado o pacote nuget Json .

Alguma ideia do que está acontecendo? A documentação para AddJsonOptions vai até .Net 2.2, então talvez o método tenha sido preterido no 3.0 em favor de algum outro mecanismo de configuração.

Respostas:


203

Como parte do ASP.NET Core 3.0, a equipe deixou de incluir o Json.NET por padrão. Você pode ler mais sobre isso em geral no anúncio sobre alterações importantes em Microsoft.AspNetCore.App .

Em vez de Json.NET, ASP.NET Core 3.0 e .NET Core 3.0 incluem uma API JSON diferente que se concentra um pouco mais no desempenho. Você pode aprender mais sobre isso no anúncio sobre “O futuro do JSON no .NET Core 3.0” .

Os novos modelos para ASP.NET Core não serão mais agrupados com Json.NET, mas você pode facilmente reconfigurar o projeto para usá-lo em vez da nova biblioteca JSON. Isso é importante para compatibilidade com projetos mais antigos e também porque a nova biblioteca não deve ser uma substituição completa, então você não verá o conjunto completo de recursos lá.

Para reconfigurar seu projeto ASP.NET Core 3.0 com Json.NET, você precisará adicionar uma referência a NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson, que é o pacote que inclui todos os bits necessários. Então, no Startup ConfigureServices, você precisará configurar o MVC assim:

services.AddControllers()
    .AddNewtonsoftJson();

Isso configura os controladores MVC e os configura para usar Json.NET em vez dessa nova API. Em vez de controladores, você também pode usar uma sobrecarga MVC diferente (por exemplo, para controladores com visualizações ou páginas do Razor). Esse AddNewtonsoftJsonmétodo tem uma sobrecarga que permite configurar as opções do Json.NET como você fazia AddJsonOptionsno ASP.NET Core 2.x.

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

41
Para aqueles que acompanham em casa ... ao migrar um projeto, você pode precisar adicionar uma referência de nuget a "Microsoft.AspNetCore.Mvc.NewtonsoftJson" para obter a extensão "AddNewtonsoftJson". No momento em que este artigo foi escrito, isso requer que "incluir pré-lançamentos" seja verificado se você estiver usando o gerenciador do Visual Studio Nuget.
NeilMacMullen

1
Observe que geralmente não recomendo migrar para ASP.NET Core 3 com aplicativos reais ainda. Se você quiser apenas brincar, com certeza, mas ainda há algumas partes em movimento antes do lançamento final, então você terá que manter isso em mente se quiser migrar para ele mais cedo.
cutucar

1
Isso pode acionar "Operações síncronas não são permitidas", verifique stackoverflow.com/questions/47735133/… para obter mais informações
verbedr

8
Para mim AddNewtonsoftJsonestá faltando, mesmo depois de fazer referência a essa Microsoft.AspNetCore.Mvc.NewtonsoftJsonreferência.
Saeed Neamati

2
@avenmore O novo serializador usa um conjunto separado de atributos. Você pode usar a [JsonIgnore]partir do System.Text.Json.Serializationnamespace.
cutucar

21

Isso funcionou para mim, ao usar .Net Core 3:

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});

Eu presumiria que a linha deveria ser:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer

1
Sim, eu também, mas não. Essa resposta funcionou para mim, no entanto.
Martin

2
Não há necessidade de o.JsonSerializerOptions.DictionaryKeyPolicy = null;eo.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani

Gostaria de poder usar esta resposta, mas meu aplicativo foi construído usando atributos Newtonsoft, que o novo serializador MS ignora, o que significa que tenho que continuar usando o serializador Newtonsoft com AddNewtonsoftJson. Talvez a MS pudesse adicionar uma opção para respeitar os atributos da Newtonsoft, enquanto ainda obtém os ganhos de desempenho que prometem.
Eric

@eric Sim, você está certo, mas o desempenho da Newtonsoft é suficiente para a maioria das situações.
Mohammad Olfatmiri

0

Isso ajudaria

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddJsonOptions(options=> {  options.JsonSerializerOptions.PropertyNamingPolicy = null;
                 options.JsonSerializerOptions.DictionaryKeyPolicy = null;

            });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));
        }
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.