美化WebApi,使其统一返回Json格式

博客部分代码来自其他博主,暂时找不到你的博文连接,如果您觉得我的代码中引入了您的代码或者文章,可在下方把您的博客文章写在下面,谢谢!!!

WebApi有两种返回数据格式,一种是XML,一种是Json,在WebAPI中,你可以选择你自己喜欢的返回数据格式,在这里,我基本都是返回的是Json,基本上,使用WebApi 的时候,我都设置的是返回Json,我们美化接口,乃知全局,都将以Json格式显示出来!

这是 API 默认返回的XML格式,我们接下来美化一下!

 一:新建一个空的WebApi项目

创建一个文件夹 ,我这里  我这里取名字为:InteFilter

创建一个类  JsonContentNegotiator  ,继承  IContentNegotiator

需要引入这三个命名空间

1 using System.Net.Http;
2 using System.Net.Http.Formatting;
3 using System.Net.Http.Headers;
 1 namespace DemoApi.InteFilter
 2 {
 3     public class JsonContentNegotiator: IContentNegotiator
 4     {
 5         private readonly JsonMediaTypeFormatter _jsonFormatter;
 6         public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
 7         {
 8             _jsonFormatter = formatter;
 9         }
10         public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
11         {
12             // 对 JSON 数据使用混合大小写。驼峰式,但是是javascript 首字母小写形式.小驼峰命名法。
13             //config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new  CamelCasePropertyNamesContractResolver();
14             // 对 JSON 数据使用混合大小写。跟属性名同样的大小.输出
15             _jsonFormatter.SerializerSettings.ContractResolver = new UnderlineSplitContractResolver(); //小写命名法。
16             _jsonFormatter.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";//解决json时间带T的问题
17             _jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;//解决json格式化缩进问题
18             _jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;//解决json序列化时的循环引用问题
19             var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
20             return result;
21         }
22     }
23 
24 }

二  创建 UnderlineSplitContractResolver 类  继承 DefaultContractResolver  (需要引入 using Newtonsoft.Json.Serialization;)

 1 namespace DemoApi.InteFilter
 2 {
 3     public class UnderlineSplitContractResolver : DefaultContractResolver
 4     {
 5         protected override string ResolvePropertyName(string propertyName)
 6         {
 7             return CamelCaseToUnderlineSplit(propertyName);//下划线分割命名法
 8             //return propertyName.ToLower();//小写命名法
 9         }
10 
11         private string CamelCaseToUnderlineSplit(string name)
12         {
13             StringBuilder builder = new StringBuilder();
14             for (int i = 0; i < name.Length; i++)
15             {
16                 var ch = name[i];
17                 if (char.IsUpper(ch) && i > 0)
18                 {
19                     var prev = name[i - 1];
20                     if (prev != '_')
21                     {
22                         if (char.IsUpper(prev))
23                         {
24                             if (i < name.Length - 1)
25                             {
26                                 var next = name[i + 1];
27                                 if (char.IsLower(next))
28                                 {
29                                     builder.Append('_');
30                                 }
31                             }
32                         }
33                         else
34                         {
35                             builder.Append('_');
36                         }
37                     }
38                 }
39 
40                 builder.Append(char.ToLower(ch));
41             }
42 
43             return builder.ToString();
44         }
45 
46 
47     }
48 }

三  打开WebApiConfig

引入 

using System.Net.Http.Formatting;
   /// <summary>
    /// WebApi 网关配置 需要下载 cors 包  ,使可以跨域网站资源请求
    /// </summary> 
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            #region [=>2、WebApi 返回JSON,推荐做法性能最高]
            config.Services.Replace(typeof(IContentNegotiator), new InteFilter.JsonContentNegotiator(new JsonMediaTypeFormatter()));
            #endregion
            // Web API 配置和服务

            config.MapHttpAttributeRoutes();
            // string url= "";
            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",   
                   defaults: new { controller = "Home", action = "Index", id = RouteParameter.Optional }
            );
        }
    }

结果:

 

致敬开源者

原文地址:https://www.cnblogs.com/whatarey/p/11293963.html