Suprimir propiedades con valor nulo en ASP.NET Web API

94

He creado un proyecto de API WEB ASP.Net que será utilizado por una aplicación móvil. Necesito la respuesta json para omitir las propiedades nulas en lugar de devolverlas como property: null.

¿Cómo puedo hacer esto?

Juliano Nunes Silva Oliveira
fuente

Respuestas:

132

En el WebApiConfig:

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

O, si desea más control, puede reemplazar todo el formateador:

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

config.Formatters.RemoveAt(0);
config.Formatters.Insert(0, jsonformatter);
Filip W
fuente
2
Vergüenza config.Formatters.XmlFormatter no tiene la misma propiedad ...: /
RoboJ1M
8
Desde Json.NET 5 (no estoy seguro para versiones anteriores), también puede hacer esto: config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore- esto actualizará el manejo del valor nulo sin restablecer ninguna otra configuración de serialización json (como usar minúsculas en la primera letra de las propiedades)
Ivaylo Slavov
7
¿Es posible conseguir que lo haga para una sola propiedad?
Martin Brown
1
el NullValueHandling = NullValueHandling.Ignore no funcionó para mis resultados
Nathan Tregillus
2
Si el cambio debe ocurrir en función de cada propiedad, y uno está utilizando una nueva versión de lo suficiente Json.Net, se puede utilizar este atributo en la propiedad: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)].
Carsten Führmann
32

Terminé con este fragmento de código en el archivo startup.cs usando ASP.NET5 1.0.0-beta7

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

Para ASP.NET Core 3.0, el ConfigureServices()método en el Startup.cscódigo debe contener:

services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.IgnoreNullValues = true;
    });
Dave Werner
fuente
¿Cuál es la pregunta?
Orestis Zekai
4

Si está utilizando vnext, en proyectos de api web de vnext, agregue este código al archivo 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
fuente
4

También puedes usar [DataContract]y [DataMember(EmitDefaultValue=false)]atributos

goofballLogic
fuente
1
Esta es la única respuesta que cubre tanto la respuesta xml como la json.
ColmanJ