博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webapi返回json格式优化 转载https://www.cnblogs.com/GarsonZhang/p/5322747.html
阅读量:5243 次
发布时间:2019-06-14

本文共 5569 字,大约阅读时间需要 18 分钟。

一、设置webapi返回json格式

  在App_Start下的WebApiConfig的注册函数Register中添加下面这代码

1
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
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,代码如下:
///     /// 解决返回json数据null问题    ///     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
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(); } } ///
/// 解决返回json数据null问题 /// 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);        }    }

 

结束

转载于:https://www.cnblogs.com/Jeely/p/10958998.html

你可能感兴趣的文章
P1107 最大整数
查看>>
监控CPU和内存的使用
查看>>
Ubuntu14.04设置开机自启动程序
查看>>
多进程与多线程的区别
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
java 常用命令
查看>>
CodeForces Round #545 Div.2
查看>>
卷积中的参数
查看>>
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
学习Spring Boot:(二十八)Spring Security 权限认证
查看>>
深入浅出JavaScript(2)—ECMAScript
查看>>
STEP2——《数据分析:企业的贤内助》重点摘要笔记(六)——数据描述
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>