webapi返回json格式优化 转载https://www.cnblogs.com/GarsonZhang/p/5322747.html
一、设置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的更多相关文章
- webapi返回json格式优化
一.设置webapi返回json格式 在App_Start下的WebApiConfig的注册函数Register中添加下面这代码 config.Formatters.Remove(config.For ...
- (转)WebApi返回Json格式字符串
原文地址:https://www.cnblogs.com/elvinle/p/6252065.html WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉 ...
- WebApi返回Json格式字符串
WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...
- webapi返回json格式,并定义日期解析格式
1.webapi返回json格式 var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferen ...
- WebAPI搭建(二) 让WebAPI 返回JSON格式的数据
在RestFul风格盛行的年代,对接接口大多数人会选择使用JSON,XML和JSON的对比传送(http://blog.csdn.net/liaomin416100569/article/detail ...
- 如何让Asp.net webAPI返回JSON格式数据
ASP.NET Web API 是新一代的 HTTP 網路服務開發框架,除了可以透過 Visual Studio 2012 快速開發外 (內建於 ASP.NET MVC 4 的 Web API 專案範 ...
- 指定webapi 返回 json 格式 ; GlobalConfiguration.Configuration.Formatters.Clear()
因为 Internet Explorer 和 Firefox 发送了不同的 Accept 头,所以 web API 在响应里就发送了不同的内容类型. 解决方法,在 Global.asax的 App ...
- 如何让webapi只返回json格式数据
最近脑子不好用,总记不住事,以前搞过让webapi只返回json格式的数据,今天有人问我又突然想不起了,后来总结一下,备忘一下,大概有下面几种处理方式 1.在WebApiConfig类的Registe ...
- ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)
相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...
随机推荐
- Hibernate入门2
实体类的编写规则 要求实体类的属性是私有的 要求实体类中的私有属性有公开的get和set方法(设置器和访问器) 要求实体类有一个属性作为唯一值(一般使用id值) 实体类属性建议不使用基本数据类型,使用 ...
- HashSet -无序,不重复集合
package cn.learn.collection.Set; import java.util.Objects; public class IsPerson { private int age; ...
- Python入门习题1.温度转换
这一节的课堂例题为: 例1.编写一个Python程序,完成摄氏度到华氏度,华氏度到摄氏度的温度转换. 解: (1)分析问题:利用程序实现温度转换,由用户输入温度值,程序给出输出结果. (2)划分边界: ...
- python依赖包整体迁移方法(pip)
做个记录 python依赖包整体迁移方法
- Linux常用命令操作文档
Ls命令:列出目录内容 选项 长选项 含义 -a --all 列出所有文件,包括隐藏的文件 -d --directory 指定一个目录 -F --classify 在每个列出的名字后面加上类型指示符( ...
- mt-picker 样式修改
// html : <div class="applyInformations" @click="chooseSex"> <p>性别&l ...
- C#面试 笔试题 五
1.什么是受管制的代码? 答:unsafe:非托管代码.不经过CLR运行. 2.net Remoting 的工作原理是什么? 答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置. ...
- 常用颜色的RGB分布
RGB色彩模式是工业界的一种颜色标准,它通过对红(RED).绿(GREEN).蓝(BLUE)三种基本颜色的相互组合从而叠加出各种颜色.RGB色彩模式为每一个红.绿.蓝分类了0-255范围内的亮度值. ...
- 295-Xilinx Kintex-7 X7K325T的半高PCIe x4双路万兆光纤收发卡
Xilinx Kintex-7 X7K325T的半高PCIe x4双路万兆光纤收发卡 一.板卡概述 本板卡系我公司自主研发,采用Xilinx公司的XC7K325T-2FFG676I芯片作为 ...
- Codeforces Round #394 (Div. 2) - A
题目链接:http://codeforces.com/contest/761/problem/A 题意:给定a个偶数,b个奇数,问是否能构成奇偶相间的阶梯.思路:a和b相差小于等于1即可构造出来.特判 ...