webapi返回json格式優化


一、設置webapi返回json格式

  在App_Start下的WebApiConfig的注冊函數Register中添加下面這代碼

config.Formatters.Remove(config.Formatters.XmlFormatter);

 

二、設置返回Json鍵值統一為小寫

   新建一個類並繼承自DefaultContractResolver,重寫ResolvePropertyName方法,

   

 public class UnderlineSplitContractResolver : DefaultContractResolver
 {
     protected override string ResolvePropertyName(string propertyName)
     {
         //return CamelCaseToUnderlineSplit(propertyName);
         return propertyName.ToLower();
     }
 }

在WebApiConfig.Register方法中添加配置代碼

// 對 JSON 數據使用混合大小寫。跟屬性名同樣的大小.輸出
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new UnderlineSplitContractResolver();

三、在返回的JSON格式中出現兩個很不開心的問題

看圖:

第一個問題是為null的字符串,這里也返回了null,感覺返回""感覺好一點

第二個問題,lastupdate是時間格式,這種格式化看着有點不爽,如果是"2016-03-25 17:19:17"感覺就好點了

解決如下:

在解決第二個問題時我們新建的類UnderlineSplitContractResolver里面重寫CreateProperties方法:

 //解決API NULL 和時間格式問題
 protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
 {
     return type.GetProperties
.Select(p
=> { var jp = base.CreateProperty(p, memberSerialization); if (jp.PropertyType == typeof(System.String)) jp.ValueProvider = new NullToEmptyStringValueProvider(p); if (jp.PropertyType.ToString().Contains("System.DateTime")) jp.Converter = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }; return jp; }).ToList(); }
NullToEmptyStringValueProvider類繼承IValueProvider,代碼如下:
    /// <summary>
    /// 解決返回json數據null問題
    /// </summary>
    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 = "";
            if (_MemberInfo.PropertyType == typeof(string) && result == null)
                result = "";
            return result;
        }
        public void SetValue(object target, object value)
        {
            _MemberInfo.SetValue(target, value);
        }
    }

此時問題已經解決,返回的json如下:

看起來是不是舒服多了?

也可以用如下代碼,忽略null值

config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;

 

四、整理一下代碼

 新建一個文件InitAPI.cs,代碼如下:

  public class InitAPI
    {
        public static void Init(HttpConfiguration config)
        {
            //HttpConfiguration config = GlobalConfiguration.Configuration;
            config.Formatters.Remove(config.Formatters.XmlFormatter);


            // 解決json序列化時的循環引用問題
            config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            // 對 JSON 數據使用混合大小寫。駝峰式,但是是javascript 首字母小寫形式.
            //config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new  CamelCasePropertyNamesContractResolver();
            // 對 JSON 數據使用混合大小寫。跟屬性名同樣的大小.輸出
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new UnderlineSplitContractResolver();
        }
    }

    public class UnderlineSplitContractResolver : DefaultContractResolver
    {


        protected override string ResolvePropertyName(string propertyName)
        {
            //return CamelCaseToUnderlineSplit(propertyName);
            return propertyName.ToLower();
        }
        private string CamelCaseToUnderlineSplit(string name)
        {
            return name.ToLower();
        }



        //解決API NULL 和時間格式問題
        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            return type.GetProperties()
                   .Select(p =>
                   {
                       var jp = base.CreateProperty(p, memberSerialization);
                       if (jp.PropertyType == typeof(System.String))
                           jp.ValueProvider = new NullToEmptyStringValueProvider(p);
                       if (jp.PropertyType.ToString().Contains("System.DateTime"))
                           jp.Converter = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
                       return jp;
                   }).ToList();
        }



    }
    /// <summary>
    /// 解決返回json數據null問題
    /// </summary>
    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 = "";
            if (_MemberInfo.PropertyType == typeof(string) && result == null)
                result = "";
            return result;
        }
        public void SetValue(object target, object value)
        {
            _MemberInfo.SetValue(target, value);
        }
    }
在WebApiConfig中直接調用InitAPI.Init(config),代碼如下:
 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服務

            // Web API 路由
            config.MapHttpAttributeRoutes();

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

            InitAPI.Init(config);
        }
    }

 

結束

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM