解决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 ...
随机推荐
- JS基础入门篇(十八)—日期对象
1.日期对象 日期对象: 通过new Date()就能创建一个日期对象,这个对象中有当前系统时间的所有详细信息. 以下代码可以获取当前时间: <script> var t = new Da ...
- Linux中软连接和硬连接的区别
首先,我们要清楚符号链接的目的,在不改变原目录/文件的前提下,起一个方便的别名(在这起个别名,让我想到前阶段学C里typedef也是起别名的). 1.软连接就相当于windows的快捷方式.例如:ln ...
- 必备技能二、es6
一.ES6模块 ES6 引入了模块化,其设计思想是在编译时就能确定模块的依赖关系,以及输入和输出的变量. ES6 的模块化分为导出(export) @与导入(import)两个模块. 特点 ES6 的 ...
- 原来rollup这么简单之 rollup.rollup篇
大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. 计划 rollup系列打算 ...
- Markdown怎么使用制表符TAB键?为什么TAB失灵了?
目录 问题描述 解决办法 问题描述 我们写文章(Markdown文章)的时候,经常想使用自然段标记划分段落,可是我们会发现,不管是任何编辑器,tab键都没有用,怎么办? 解决办法 语法: 文章- ...
- 搭建OpenStack私有云准备工作
Centos7安装完成后克隆其他子节点 首先在VMware中:右击 虚拟机controller-->设置-->添加-->网络适配器,然后做如下设置: 在VMware中操作 点击:克隆 ...
- XiaoQi.Study项目(二)
一.EF Core 使用的补充 1) 创建 接口 IEFCoreService 2) 实现 接口 EFCoreService 3) 在Startup.cs 中注册 ef 服务 并在控制器中注入使用 ...
- Css盒模型属性详解(margin和padding)
Css盒模型属性详解(margin和padding) 大家好,我是逆战班的一名学员,今天我来给大家分享一下关于盒模型的知识! 关于盒模型的属性详解及用法 盒模型基本属性有两个:padding和marg ...
- cocosCreator定制小游戏构建模板
cocosCreator定制小游戏构建模板 1. 解决痛点 在开发微信小游戏过程中,需要在微信小游戏game.json加入一个配置键navigateToMiniProgramAppIdList,但常规 ...
- MySQL语句-关于表单的操作总结(新手)
MySQl表的操作: 主键的添加: CREATE TABLE 表名(列名称 数据类型--id INT PRIMARY KEY AUTO_INCREMENT,列名称2 数据类型,············ ...