一、設置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); } }
結束
