Acabei de trocar nosso projeto do ASP .Net Core 1.0.0-rc2-final para 1.0.0. Nosso site e cliente pararam de funcionar devido à capitalização das propriedades JSON. Por exemplo, esta linha de JavaScript agora falha
for (var i = 0; i < collection.Items.length; i++){
porque o controlador agora chama o array de "itens" em vez de "Itens". Não fiz nenhuma alteração além de instalar os pacotes atualizados e editar o arquivo project.json. Não alterei os arquivos de modelo C # que ainda capitalizam suas propriedades.
Por que os controladores ASP.Net Core começaram a retornar JSON com propriedades de letras minúsculas? Como faço para voltar a eles honrando o caso dos nomes de propriedade do modelo?
c#
asp.net-core
asp.net-core-1.0
Dumbledad
fonte
fonte
Respostas:
MVC agora serializa JSON com nomes de caixa de camelo por padrão
Use este código para evitar nomes de caso camelo por padrão
services.AddMvc() .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
Fonte: https://github.com/aspnet/Announcements/issues/194
fonte
Json()
chamada?Caso você tenha encontrado isso no Google e procurando uma solução para o Core 3.
Core 3 usa
System.Text.Json
, o que por padrão não preserva o caso. Conforme mencionado neste problema do GitHub , definir oPropertyNamingPolicy
como null resolverá o problema.public void ConfigureServices(IServiceCollection services) { ... services.AddControllers() .AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
e se você não quiser alterar as configurações globais, para apenas uma ação é assim:
return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });
fonte
Você pode mudar o comportamento desta forma:
services .AddMvc() .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
Veja o anúncio aqui: https://github.com/aspnet/Announcements/issues/194
fonte
Para aqueles que migraram para o Core 3.1 e têm o projeto Core MVC, podem usar o seguinte código de configuração em Startup.cs:
public void ConfigureServices(IServiceCollection services) { ... services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null); ... }
fonte
Isso irá corrigi-lo no dotnet core 3 webapi, de forma que não mude os nomes de suas propriedades e você retorne ao seu cliente exatamente o que pretendia.
Em Startup.cs:
public void ConfigureServices(IServiceCollection services) { services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null); services.AddHttpClient(); }
fonte
Para alguém que está usando ASP.net WEB API (em vez de ASP.NET Core).
Adicione esta linha em seu WebApiConfig.
//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
Adicionando isso como uma resposta aqui, porque isso surge primeiro na pesquisa do Google para API da web também.
fonte
Para versões Core 2.x, usando este código, você pode evitar nomes de caixa de camelo por padrão. Você precisa adicionar o código a seguir dentro do método ConfigureServices do arquivo Startup.cs.
services.AddMvc() .AddJsonOptions(o => { if (o.SerializerSettings.ContractResolver != null) { var castedResolver = o.SerializerSettings.ContractResolver as DefaultContractResolver; castedResolver.NamingStrategy = null; } });
fonte
Para quem não deseja defini-lo globalmente, é possível usar o ContractResolver também para retornar como resultado Json:
public IActionResult MyMethod() { var obj = new {myValue = 1}; return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()}); }
fonte