解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题
DateTime类型数据格式问题
问题
在使用ASP.NET MVC 在写项目的时候发现,返回给前端的JSON数据,日期类型是 Date(121454578784541) 的格式,需要前端来转换一下才能用来使用。
C#对象属性名称转换成JSON自动转成“驼峰命名法”
问题
在C#中推荐的属性命名方式是“帕斯卡命名法”【首字母大写】但是在前端推荐命名方式为“驼峰命名法”【首字母小写】,这样如果直接序列化C#对象,返回的属性就是大写的了
MVC 默认的返回JsonResult在序列化有循环引用对象时候会出现异常
问题
序列化类型为“XXXXXX.XXXX.XXX”的对象时检测到循环引用。
解决办法
创建新的 JsonResult 对象
使用新的JSON序列化组件 Newtonsoft.Json
Install-Package Newtonsoft.Json
创建新的 JsonResult 对象
然后在新的 JsonResult 类型中将处理JSON序列化的对象改为 Newtonsoft.Json
并设置JSON转换的日期格式为 yyyy-MM-dd HH:mm:ss 例如:【2020-03-28 17:36:23】
并设置 转换的属性为“驼峰命名法”
/// <summary>
/// JSON结果返回对象
/// </summary>
public class JsonNetResult : JsonResult
{
/// <summary>
/// 实例化JSON结果返回对象
/// </summary>
/// <param name="data">需要序列化的对象</param>
/// <returns>JSON结果对象</returns>
public JsonNetResult(object data)
: this(data, JsonRequestBehavior.DenyGet)
{
} /// <summary>
/// 实例化JSON结果返回对象
/// </summary>
/// <param name="data">需要序列化的对象</param>
/// <param name="jsonRequestBehavior">设置是否允许GET请求获取JSON结果对象</param>
/// <returns>JSON结果对象</returns>
public JsonNetResult(object data, JsonRequestBehavior jsonRequestBehavior)
{
this.Data = data;
this.JsonRequestBehavior = jsonRequestBehavior;
this.Settings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore, //忽略循环引用
DateFormatString = "yyyy-MM-dd HH:mm:ss", //输出的日期格式
ContractResolver = new CamelCasePropertyNamesContractResolver() //设置属性的名称为“驼峰命名法”
};
} /// <summary>
/// JSON序列化设置对象
/// </summary>
public JsonSerializerSettings Settings { get; set; } /// <summary>
/// 向响应流返回结果方法
/// </summary>
public override void ExecuteResult(ControllerContext context)
{
//判断当前请求是否为GET且判断是否允许GET获取JSON,不允许就报错
if ("GET".Equals(context.HttpContext.Request.HttpMethod, StringComparison.OrdinalIgnoreCase) &&
this.JsonRequestBehavior == JsonRequestBehavior.DenyGet)
throw new Exception("不允许GET请求返回JSON数据!"); //判断是否改变响应数据编码
if (this.ContentEncoding != null)
context.HttpContext.Response.ContentEncoding = this.ContentEncoding;
//如果当前需要序列化的数据为NULL就直接返回
if (this.Data == null)
return;
//设置响应数据内容格式为 json
context.HttpContext.Response.ContentType =
string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
//向响应流写入序列化的数据
JsonSerializer.Create(Settings).Serialize(context.HttpContext.Response.Output, this.Data);
}
}
使用新的 JsonResult 对象 方法一(推荐)
使用过滤器,将JsonResult对象替换成 JsonNetResult 对象
创建一个ActionFilter,用来将返回的JsonResult对象转换成新的JsonNetResult对象
/// <summary>
/// 将Action返回的JsonResult转换成JsonNetAction
/// </summary>
public class JsonNetActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
} public void OnActionExecuted(ActionExecutedContext filterContext)
{
//判断是JsonResult对象
if (filterContext.Result is JsonResult && !(filterContext.Result is JsonNetResult))
{
//得到原JsonResult对象
var jsonResult = (JsonResult) filterContext.Result;
//创建新的JsonNetResult对象
var jsonNetResult = new JsonNetResult(jsonResult.Data)
{
ContentEncoding = jsonResult.ContentEncoding,
ContentType = jsonResult.ContentType,
JsonRequestBehavior = jsonResult.JsonRequestBehavior,
MaxJsonLength = jsonResult.MaxJsonLength,
RecursionLimit = jsonResult.RecursionLimit
};
//将新的JsonNetResult对象赋值给返回结果
filterContext.Result = jsonNetResult;
}
}
}
在Global.asax注册过滤器
public class MvcApplication : HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes); //注册过滤器
GlobalFilters.Filters.Add(new JsonNetActionFilter());
}
}
使用
public class HomeController : Controller
{
public ActionResult GetStudent()
{
var student = new StudentDto
{
Id = ,
Name = "张三",
Age = ,
ClassName = "B36",
CreateDate = DateTime.Now,
};
return Json(student);
}
}
返回给前端的JSON数据
{"id":1,"name":"张三","age":18,"className":"B36","createDate":"2020-03-28 17:47:29"}
使用新的 JsonResult 对象 方法二
创建一个BaseController 来重写他的Json()方法
创建一个 BaseController 类 继承自 Controller 类
并重写他的 Json() 方法,其他Controller 类都继承自 BaseController
这样 可以直接沿用之前的 返回Json对象方法
/// <summary>
/// 父 控制器
/// </summary>
public class BaseController : Controller
{
/// <summary>
/// 返回 JsonNetResult 对象
/// </summary>
/// <param name="data">需要返回序列化的对象</param>
/// <param name="contentType">内容格式</param>
/// <param name="contentEncoding">内容编码</param>
/// <param name="behavior">指定是否允许来自客户端的 HTTP GET 请求。</param>
/// <returns>JsonResult对象</returns>
protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonNetResult(data)
{
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
}
使用
public class HomeController : BaseController
{
public ActionResult GetStudent()
{
var student = new StudentDto
{
Id = ,
Name = "张三",
Age = ,
ClassName = "B36",
CreateDate = DateTime.Now,
};
//将当前对象序列化成JSON返回给前端
return Json(student);
}
}
返回给前端的JSON数据
{"id":1,"name":"张三","age":18,"className":"B36","createDate":"2020-03-28 17:47:29"}
使用新的 JsonResult 对象 方法三
创建一个JSON帮助类
/// <summary>
/// JSON帮助类
/// </summary>
public static class JsonHelper
{
/// <summary>
/// 将一个对象序列化成JSON格式字符串返回给请求方
/// </summary>
/// <param name="obj">需要序列化的对象</param>
/// <param name="jsonRequestBehavior">设置是否允许GET请求获取JSON结果对象</param>
/// <returns>JSON结果对象</returns>
public static JsonNetResult Json(object obj,
JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
{
return new JsonNetResult(obj, jsonRequestBehavior);
} /// <summary>
/// 将当前对象序列化成JSON格式字符串返回给请求方
/// </summary>
/// <param name="obj">需要序列化的对象</param>
/// <param name="jsonRequestBehavior">设置是否允许GET请求获取JSON结果对象</param>
/// <returns>JSON结果对象</returns>
public static JsonNetResult ToJsonResult(this object obj,
JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
{
return new JsonNetResult(obj, jsonRequestBehavior);
}
}
使用
public ActionResult GetStudent()
{
var student = new StudentDto
{
Name = "张三",
Age = ,
ClassName = "B36",
CreateDate = DateTime.Now,
};
//直接调用扩展方法 ToJsonResult 来获取新的 JsonResult
return student.ToJsonResult();
}
返回给前端的JSON数据
{"id":1,"name":"张三","age":18,"className":"B36","createDate":"2020-03-28 17:47:29"}
解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题的更多相关文章
- 解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
问题背景: 在使用asp.net mvc 结合jquery esayui做一个系统,但是在使用使用this.json方法直接返回一个json对象,在列表中显示时发现datetime类型的数据在转为字符 ...
- 用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
当用ajax异步时,返回JsonResult格式的时候,发现当字段是dateTime类型时,返回的json格式既然是“/Date(1435542121135)/” 这样子的,当然这不是我们想要的格式. ...
- mybatis会自动把字段名中的下划线转为驼峰命名法?
先看一下转化的调用堆栈: 代码如下: 上面代码只是去掉了下划线,并没有首字母小写变大写的代码.再跟进findProperty方法可以找到获取驼峰结果的代码如下: 可以看出通过reflector.fin ...
- 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数
[问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...
- 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds
RSS全称Really Simple Syndication.一些更新频率较高的网站可以通过RSS让订阅者快速获取更新信息.RSS文档需遵守XML规范的,其中必需包含标题.链接.描述信息,还可以包含发 ...
- 在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录
在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录 前言 最近有个Web项目,业务功能不复杂,但是这个客户(某政府部门)有两个硬性要求:1 ...
- Asp.net MVC 4新项目中创建area的后续操作
Asp.net MVC 4新项目中创建area后,往往HomeController与area的HomeController路由发生混淆,需要手工设置一些地方避免mvc无法识别默认路由的状况. 无废话具 ...
- 解决Win10系统下 C# DateTime 出现星期几的问题 解决ASP.NET MVC 接受Request Playload参数问题
解决Win10系统下 C# DateTime 出现星期几的问题 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToStri ...
- java和数据库中日期类型的常见用法
(1)java中日期类型:Date.Timestamp(2)数据库中:Date.Timestamp(3)字符串和Date之间的格式化转换: SimpleDateFormat类方法: format ...
随机推荐
- SpringBoot整合Mybatis对单表的增、删、改、查操作
一.目标 SpringBoot整合Mybatis对单表的增.删.改.查操作 二.开发工具及项目环境 IDE: IntelliJ IDEA 2019.3 SQL:Navicat for MySQL 三. ...
- Java的三魂七魄 —— 高级多线程
目录 Java的三魂七魄 -- 高级多线程 一.多线程的创建 二.线程安全问题 三.线程通信问题 四.更多实例 1.用线程同步的方法解决单例模式的线程安全问题 2.银行存钱问题(线程安全问题) 3.生 ...
- 多图文,详细介绍mysql各个集群方案
目录 多图文,详细介绍mysql各个集群方案 一,mysql原厂出品 二,mysql第三方优化 三,依托硬件配合 四,其它 多图文,详细介绍mysql各个集群方案 集群的好处 高可用性:故障检测及迁移 ...
- 「从零单排HBase 05」核心特性region split
HBase拥有出色的扩展性,其中最依赖的就是region的自动split机制. 1.split触发时机与策略 前面我们已经知道了,数据写入过程中,需要先写memstore,然后memstore满了以后 ...
- flask 模型一对多个人理解
在modle中创建两个模型表 class User(db.Model): id = db.Column(db.Integer,primary_key=True,autoincrement=True) ...
- 手机app抓包工具,安卓手机adb无线连接
默认手机已经usb调试配置完成 网络必须在同一网络中,每次断开wifi连接,都必须重新重做一次 使用数据线连接电脑 cmd 打开一个命令行 输入 # abd如果没有配置环境变量,请配置或者进入adb文 ...
- 【原创】(五)Linux进程调度-CFS调度器
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- Docker 技术系列之安装多版本Mysql5.6和Mysql5.7
大家好,后面的就不是关于MAC专有的内容,基本是跟Java环境,基础技术方面有关.所以这个教程对于在linux系统还是macOS都是通用的,不用担心. 上一篇,我们安装好对应的Docker之后,感受到 ...
- [BUG]document.body.scrollTop=0不生效(回到顶部)
描述 让body回滚到最顶部,设置 document.body.scrollTop = 0; . 微信内,安卓设备可以,ios设备不可以. 原因 MDN中 scrollTop是这样定义的 一个元素 ...
- Http报文和Request和Response的常用方法
简述 它是HTTP应用程序之间发送的数据块.这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分.这些报文都是在客户端.服务器和代理之间流动. HTTP报文的流 ...