Fork me on GitHub

ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)

相关博文:ASP.NET Core WebApi 返回统一格式参数

业务场景:

统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例:

{
    "response":{
        "code":200,
        "msg":"Remote service error",
        "result":null
    }
}

替换为:

{
    "response":{
        "code":200,
        "msg":"Remote service error",
        "result":""
    }
}

具体实现:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

public class WebApiResultMiddleware : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext context)
    {
        if (context.HttpContext.Request.Path.HasValue)
        {
            if (context.HttpContext.Request.Path.Value.ToLower().IndexOf(".inside.") < 0)
            {
                if (context.Result is FileContentResult || context.Result is EmptyResult)
                {
                    return;
                }
                if (context.Result is ObjectResult)
                {
                    var objectResult = context.Result as ObjectResult;
                    var settings = new JsonSerializerSettings()
                    {
                        ContractResolver = new NullToEmptyStringResolver(),
                        DateFormatString = "yyyy-MM-dd HH:mm"
                    };
                    context.Result = new JsonResult(new { data = objectResult.Value }, settings);
                }
                else
                {
                    context.Result = new ObjectResult(new { data = new { } });
                }
            }
        }
    }
}

public class NullToEmptyStringResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        return type.GetProperties()
                .Select(p => {
                    var jp = base.CreateProperty(p, memberSerialization);
                    jp.ValueProvider = new NullToEmptyStringValueProvider(p);
                    return jp;
                }).ToList();
    }
}

public class NullToEmptyStringValueProvider : IValueProvider
{
    PropertyInfo _MemberInfo;
    public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
    {
        _MemberInfo = memberInfo;
    }

    public object GetValue(object target)
    {
        object result = _MemberInfo.GetValue(target);
        if (result == null) result = "";
        return result;

    }

    public void SetValue(object target, object value)
    {
        _MemberInfo.SetValue(target, value);
    }
}

参考资料:

posted @   田园里的蟋蟀  阅读(9080)  评论(6编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2013-11-01 C算法编程题(三)画表格
点击右上角即可分享
微信分享提示