代码之家  ›  专栏  ›  技术社区  ›  Chenna

创建ActionFilter以排除WebAPI中的空值

  •  -1
  • Chenna  · 技术社区  · 7 年前

    Suppress NULL Values in every API call

    OnActionExecuted

    只想为一个方法抑制空值吗

    1 回复  |  直到 7 年前
        1
  •  1
  •   er-sho    7 年前

    如果你使用 Formatters.JsonFormatter 在你的 WebApiConfig.cs 然后

    1) 如果必须在应用程序级别忽略空值,则意味着所有api操作都将忽略空值

    public class IgnoreNullValuesFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            actionExecutedContext.ActionContext.RequestContext.Configuration.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
            base.OnActionExecuted(actionExecutedContext);
        }
    }
    

    并将此筛选器添加到 喜欢

    config.Filters.Add(new IgnoreNullValuesFilter());
    

    将此筛选器添加到后,您将发现所有api操作都返回忽略空值的数据

    [IgnoreNullValuesFilter] 因为我们在 WebApiConfig.cs网站

    WebApiConfig.cs网站

    2) 如果必须使用操作筛选器忽略特定api操作的空值

    public class IgnoreNullValuesFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            var objectContent = actionExecutedContext.Response.Content as ObjectContent;
            if (objectContent != null)
            {
                var type = objectContent.ObjectType;
                var value = JsonConvert.SerializeObject(objectContent.Value, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings
                {
                    NullValueHandling = NullValueHandling.Ignore
                });
    
                objectContent.Value = value;
    
                //If you want to send your response as strongly type
                JObject jObject = JObject.Parse(value);
                objectContent.Value = jObject;
            }
    
            base.OnActionExecuted(actionExecutedContext);
        }
    }
    

    以及忽略空值的api

    [HttpGet]
    [IgnoreNullValuesFilter]
    public IHttpActionResult ApiName()
    {
        var myObject = new Item { Id = 1, Name = "Matthew", Salary = 25000, Department = null };
    
        return Ok(myObject);
    }
    

    如果您想包含空值,那么只需从api中删除[IgnoreNullValuesFilter]

    如果你不想使用任何动作过滤器

    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public long Salary { get; set; }
        public string Department { get; set; }
    }
    

    你的API看起来像

    [HttpGet]
    public IHttpActionResult ApiName()
    {
        var myObject = new Item { Id = 1, Name = "Matthew", Salary = 25000, Department = null };
    
        return Json(myObject, new JsonSerializerSettings()
        {
            NullValueHandling = NullValueHandling.Ignore
        });
    }
    

    [HttpGet]
    public IHttpActionResult ApiName()
    {
        var myObject = new Item1 { Id = 1, Name = "Matthew", Salary = 25000, Department = null };
    
        var jsonIgnoreNullValues = JsonConvert.SerializeObject(myObject, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings
            {
              NullValueHandling = NullValueHandling.Ignore
            });
    
        JObject jObject = JObject.Parse(jsonIgnoreNullValues);
    
        return Ok(jObject);
    }
    

    结果:

    enter image description here

    Item 有财产 department = null

    你可以发送 myObject