.net webapi 返回json全局配置及使用特性路由原创
金蝶云社区-云社区用户26064194
云社区用户26064194
1人赞赏了该文章 1,430次浏览 未经作者许可,禁止转载编辑于2022年03月07日 19:52:40
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http.Formatting;
using System.Text;
using System.Web.Http;

namespace WebApi
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            #region json相关配置调整

            // json格式化时,[Serializable]会导致读取到私有属性,此处取消读取私有属性
            GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver() { IgnoreSerializableAttribute = true };

            // 删除xml返回格式
            GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

            // 添加json返回格式(可省略,删除XML后,默认以json格式返回)
            GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("datatype", "json", "application/json"));

            // 忽略循环引用
            GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

            //WebApi 返回的 JSON 结果中将 null 转换为 ""
            GlobalConfiguration.Configuration.Formatters.InsertRange(0, new List<MediaTypeFormatter> { new NullToEmptyJsonFormatter() });

            // 日期格式
            ReturnDataFormatInJsonSerializersSettings();

            #endregion

            #region 路由配置

            //使用特性路由,路由路径直观
            config.MapHttpAttributeRoutes();

            //config.Routes.MapHttpRoute(
            //    name: "DefaultApi",
            //    routeTemplate: "api/{controller}/{action}/{id}",
            //    defaults: new { id = RouteParameter.Optional }
            //);

            #endregion
        }

        /// <summary>
        /// 日期序列化为 yyyy-MM-dd HH:mm:ss格式
        /// </summary>
        private static void ReturnDataFormatInJsonSerializersSettings()
        {
            var settings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
            settings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
            settings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
        }
    }

    internal class NullToEmptyJsonFormatter : JsonMediaTypeFormatter
    {
        public override JsonWriter CreateJsonWriter(Type type, Stream writeStream, Encoding effectiveEncoding)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (writeStream == null)
            {
                throw new ArgumentNullException(nameof(writeStream));
            }

            if (effectiveEncoding == null)
            {
                throw new ArgumentNullException(nameof(effectiveEncoding));
            }

            JsonWriter jsonWriter = new NullToEmptyJsonWriter(new StreamWriter(writeStream, effectiveEncoding));

            if (Indent)
            {
                jsonWriter.Formatting = Newtonsoft.Json.Formatting.Indented;
            }

            return jsonWriter;
        }
    }

    internal class NullToEmptyJsonWriter : JsonTextWriter
    {
        public NullToEmptyJsonWriter(TextWriter textWriter) : base(textWriter) { }
        public override void WriteNull()
        {
            WriteValue(string.Empty);
        }
    }
}
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;


namespace WebApi
{
    [RoutePrefix("api/webapi")]
    public class WebApiController : ApiController
    {
        /// <summary>
        ///  POST api/webapi/test
        /// </summary>
        /// <param name="inputJO"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("test")]
        public IHttpActionResult TestApi([FromBody]JObject inputJO)
        {
            if (inputJO == null)
            {
                return NotFound();
            }
            return Ok(inputJO);
        }
   }
}


图标赞 1
1人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!