Propriedades JSON agora são minúsculas na troca do ASP .Net Core 1.0.0-rc2-final para 1.0.0

92

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?

Dumbledad
fonte
2
Para aqueles que procuram a resposta para .Net Core 3, você precisa rolar até o final da página.
Mike Devenney

Respostas:

159

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

Oleksandr Fentsyk
fonte
8
netcore2: usando Newtonsoft.Json.Serialization;
david.barkhuizen
3
Não quero alterar toda a serialização JSON, apenas um caso específico que precisa corresponder ao comportamento de algum software de terceiros. Como fornecer as configurações de serialização corretas no segundo parâmetro da Json()chamada?
Auspex de
82

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 o PropertyNamingPolicycomo 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 });
Ron Rebennack
fonte
8
você é meu senhor e salvador
Jonty Morris
1
Isso funcionou bem para mim no Core 3.1. Não consegui fazer meus componentes de kendo funcionarem corretamente e descobri que o json era formatado em caixa de camelo. Isso resolveu o problema.
Waragi,
Eu também sou o seu assunto
João Loureiro
10

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);
            ...
        }
UY
fonte
Esta é a mesma resposta anterior stackoverflow.com/a/58187836/125981
Mark Schultheiss
@MarkSchultheiss provavelmente você está certo, pois minha resposta é semelhante a todas as outras, porém, quando eu estava procurando uma resposta adequada com base no meu tipo de projeto, que é MVC utilizando visualizações, não encontrei uma resposta exata que corresponda ao meu projeto. AddControllersWithViews () adiciona essas peças que faltam e achei que será útil para qualquer pessoa no futuro. Obrigado pelo seu comentário!
UY
3

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();
    }
RouterBox
fonte
Esta é a mesma resposta anterior stackoverflow.com/a/58187836/125981
Mark Schultheiss
1

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.

Abdul Rehman Sayed
fonte
0

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;
    }
});
Asiri Jayaweera
fonte
0

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