Suprimir propriedades com valor nulo na API da Web ASP.NET

94

Criei um projeto de API ASP.Net WEB que será usado por um aplicativo móvel. Preciso que a resposta json omita propriedades nulas em vez de retorná-las como property: null.

Como posso fazer isso?

Juliano Nunes Silva Oliveira
fonte

Respostas:

132

No WebApiConfig:

config.Formatters.JsonFormatter.SerializerSettings = 
                 new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore};

Ou, se quiser mais controle, pode substituir todo o formatador:

var jsonformatter = new JsonMediaTypeFormatter
{
    SerializerSettings =
    {
        NullValueHandling = NullValueHandling.Ignore
    }
};

config.Formatters.RemoveAt(0);
config.Formatters.Insert(0, jsonformatter);
Filip W
fonte
2
A vergonha config.Formatters.XmlFormatter não tem a mesma propriedade ...: /
RoboJ1M
8
Desde Json.NET 5 (não tenho certeza para versões anteriores), você também pode fazer isso: config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore- isso irá atualizar o tratamento de valor nulo sem redefinir quaisquer outras configurações de serialização json (como usar minúsculas na primeira letra das propriedades)
Ivaylo Slavov
7
É possível fazer isso para apenas uma propriedade?
Martin Brown
1
o NullValueHandling = NullValueHandling.Ignore não funcionou para meus resultados
Nathan Tregillus
2
Se a mudança deve acontecer em uma base per-propriedade, e um está usando uma suficientemente nova versão do Json.Net, pode-se usar esse atributo na propriedade: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)].
Carsten Führmann
32

Acabei com este pedaço de código no arquivo startup.cs usando ASP.NET5 1.0.0-beta7

services.AddMvc().AddJsonOptions(options =>
{
    options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});
Sboulema
fonte
13

Para ASP.NET Core 3.0, o ConfigureServices()método no Startup.cscódigo deve conter:

services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.IgnoreNullValues = true;
    });
Dave Werner
fonte
Qual é a pergunta?
Orestis Zekai
4

Se você estiver usando vnext, em projetos de API da web vnext, adicione este código ao arquivo startup.cs.

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().Configure<MvcOptions>(options =>
        {
            int position = options.OutputFormatters.FindIndex(f =>  f.Instance is JsonOutputFormatter);

            var settings = new JsonSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Ignore
            };

            var formatter = new JsonOutputFormatter();
            formatter.SerializerSettings = settings;

            options.OutputFormatters.Insert(position, formatter);
        });

    }
ilker unal
fonte
4

Você também pode usar os atributos [DataContract]e[DataMember(EmitDefaultValue=false)]

goofballLogic
fonte
1
Esta é a única resposta que abrange as respostas xml e json.
ColmanJ