一、设置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<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);
}
}

结束

webapi返回json格式优化 转载https://www.cnblogs.com/GarsonZhang/p/5322747.html的更多相关文章

  1. webapi返回json格式优化

    一.设置webapi返回json格式 在App_Start下的WebApiConfig的注册函数Register中添加下面这代码 config.Formatters.Remove(config.For ...

  2. (转)WebApi返回Json格式字符串

    原文地址:https://www.cnblogs.com/elvinle/p/6252065.html WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉 ...

  3. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...

  4. webapi返回json格式,并定义日期解析格式

    1.webapi返回json格式 var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferen ...

  5. WebAPI搭建(二) 让WebAPI 返回JSON格式的数据

    在RestFul风格盛行的年代,对接接口大多数人会选择使用JSON,XML和JSON的对比传送(http://blog.csdn.net/liaomin416100569/article/detail ...

  6. 如何让Asp.net webAPI返回JSON格式数据

    ASP.NET Web API 是新一代的 HTTP 網路服務開發框架,除了可以透過 Visual Studio 2012 快速開發外 (內建於 ASP.NET MVC 4 的 Web API 專案範 ...

  7. 指定webapi 返回 json 格式 ; GlobalConfiguration.Configuration.Formatters.Clear()

    因为 Internet Explorer 和 Firefox 发送了不同的 Accept 头,所以 web API 在响应里就发送了不同的内容类型.   解决方法,在 Global.asax的 App ...

  8. 如何让webapi只返回json格式数据

    最近脑子不好用,总记不住事,以前搞过让webapi只返回json格式的数据,今天有人问我又突然想不起了,后来总结一下,备忘一下,大概有下面几种处理方式 1.在WebApiConfig类的Registe ...

  9. ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)

    相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...

随机推荐

  1. 机器学习 coursera_ML

    在开始看之前,浏览器一直出现缓冲问题,是配置文件设置的不对,最后搞定,高兴!解决方法如下: 1.到C:\Windows\System32\drivers\etc下找到host文件,并以文本方式打开, ...

  2. react 渲染顺序

    工作中要对一个表格做再次更新, 可能是渲染后更新或者部分组件渲染之后, 对页面效果做处理 之前对react的理解, 仅仅停留在render渲染. 这次好好理解了下react的生命周期 1 react组 ...

  3. jq中的ajax传参

        一.   jq中的Ajax传参有两种           1.通过url地址来传参    2.通过data来传递参数 1. url来传递参数 function GetQuery(id) { | ...

  4. Linux:使用awk命令获取文本的某一行,某一列

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点 这里 可以跳转到教程.”. 1.打印文件的第一列( ...

  5. 前端学习(三十六)promise(笔记)

    一个页面:  头部.用户信息.新闻列表 jquery ajax:  1.$.ajax({    url:'',    dataType:'json', }).then(res=>{    //r ...

  6. Sass函数:Opacity函数-opacify()、fade-in()函数

    这两个函数是用来对已有颜色的透明度做一个加法运算,会让颜色更加不透明.其接受两个参数,第一个参数是原始颜色,第二个参数是你需要增加的透明度值,其取值范围主要是在 0~1 之间.当透明度值增加到大于 1 ...

  7. CenterOS 7安装Nginx

    1.wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm下载对 ...

  8. vue中引入了sass,又引入cssnano报错

    "cssnano": { // preset: "advanced", autoprefixer: false, "postcss-zindex&qu ...

  9. mysql创建数据库用户

    连接mysql cmd--> mysql -hlocalhost -uroot -pmypassword 退出mysql mysql> quit 也可用exit或者 \q ======== ...

  10. springboot+jsp项目实例(第二弹)(成功)

    1.创建spring boot项目,使用idea自带的spring initializr创建Spring boot的maven项目(我是先创建了一个空的项目). 开始创建Spring boot项目,点 ...