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?



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


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

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

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

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.


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

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