How to Ignore Null values while serializing OData response

前端 未结 3 842
甜味超标
甜味超标 2021-01-03 05:27

I\'ve a requirement to omit the null valued fields from the response altogether. I can do this by modifying the JsonFormatter Serialization Setting for a normal webapi respo

3条回答
  •  盖世英雄少女心
    2021-01-03 05:58

    I know it does not look anyway logical, but simply adding DefaultODataSerializerProvider and DefaultODataDeserializerProvider to the list of Formatters did the trick for me:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            //... 
    
            var odataFormatters = System.Web.OData.Formatter.ODataMediaTypeFormatters.Create(
                System.Web.OData.Formatter.Serialization.DefaultODataSerializerProvider.Instance, 
                System.Web.OData.Formatter.Deserialization.DefaultODataDeserializerProvider.Instance);
            config.Formatters.AddRange(odataFormatters);
    

    UPDATE

    Since the global formatters modification didn't work correctly for me, I chose a different way. First I stepped away from the ODataController and inherited my controller from ApiController using a custom ODataFormatting attribute:

    [ODataRouting]
    [CustomODataFormatting]
    public class MyController : ApiController
    {
        ...
    }
    
    public class CustomODataFormattingAttribute : ODataFormattingAttribute
    {
        public override IList CreateODataFormatters()
        {
            return System.Web.OData.Formatter.ODataMediaTypeFormatters.Create(
                new CustomODataSerializerProvider(),
                new System.Web.OData.Formatter.Deserialization.DefaultODataDeserializerProvider());
        }
    }
    

    The formatting attribute replaces the DefaultODataSerializerProvider with a modified one:

    public class CustomODataSerializerProvider : DefaultODataSerializerProvider
    {
        public override ODataEdmTypeSerializer GetEdmTypeSerializer(IEdmTypeReference edmType)
        {
            if(edmType.Definition.TypeKind == EdmTypeKind.Entity)
                return new CustomODataEntityTypeSerializer(this);
            else 
                return base.GetEdmTypeSerializer(edmType);
        }
    }
    

    And the last, the custom serializer filters structural properties with null values:

    public class CustomODataEntityTypeSerializer : System.Web.OData.Formatter.Serialization.ODataEntityTypeSerializer
    {
        public CustomODataEntityTypeSerializer(ODataSerializerProvider provider)
            : base(provider) { }
    
        public override ODataProperty CreateStructuralProperty(IEdmStructuralProperty structuralProperty, EntityInstanceContext entityInstanceContext)
        {
            var property = base.CreateStructuralProperty(structuralProperty, entityInstanceContext);
            return property.Value != null ? property : null;
        }
    }
    

    This doesn't seem to me like the best possible solution, but this is the one I found.

提交回复
热议问题