解决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 ...
随机推荐
- Ubuntu16.04下安装nvidia-docker2
若docker-ce.nvidia.CUDA等都安装完成之后,开启docker服务时,能够正常运行,并有预测结果,那表示服务开启没问题:若都安装成功之后,用docker命令开启服务时,一直报错,可能表 ...
- 关于org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.atguigu.crud.dao.DepartmentMapper.insertSelective的错误
今天我在使用mybatis逆向工程的时候,由于一个疏忽字打错了..结果花了一早上才把错误找全..广大小伙伴们一定要小心啊(能复制粘贴就别手打) 关于org.apache.ibatis.binding. ...
- 用 HTML5 造个有诚意的 23D 招聘稿
前言 招聘对于一个公司来说是相当重要的一个环节,首先它影响着公司未来发展的趋势,其次它为公司注入新鲜血液,使公司更具有活力.当然在工业互联网,物联网大背景下诞生的 HT 也是需要注入新鲜的血液来进一步 ...
- JavaScript的数组系列
数组 今天逆战班的学习主题关于Javascript的数组,主要有数组的概念.创建.分类.方法.遍历.经典算法...... 一.数组是什么呢?怎么写数组呢?数组有多少种呢? 数组的概念 对象是属性的无序 ...
- NLP(二十五)实现ALBERT+Bi-LSTM+CRF模型
在文章NLP(二十四)利用ALBERT实现命名实体识别中,笔者介绍了ALBERT+Bi-LSTM模型在命名实体识别方面的应用. 在本文中,笔者将介绍如何实现ALBERT+Bi-LSTM+CRF ...
- 结题报告--P2441角色属性树
题目:点此 题目描述 绪萌同人社是一个有趣的组织,该组织结构是一个树形结构.有一个社长,直接下属一些副社长.每个副社长又直接下属一些部长……. 每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素 ...
- MySQL使用前查看状态
1.检查MySQL服务器是否启动:ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql进程列表,如下所示:mysql下一行 如果mysql未启动,你可以使用以下命 ...
- Oracle根据实体类比对2个数据库结构差异(demo)
源起 在公司做项目时 经常出现 实体结构和线上的数据结构以及公司开发库数据结构不匹配的问题 但是又不能直接把开发库导入到生产库因为生产库已经有实际数据了 所以弄了一个小工具 此处只做记录用 demo级 ...
- C语言程序设计(十二) 结构体和共用体
第十二章 结构体和共用体 当需要表示复杂对象时,仅使用几个基本数据类型显然是不够的 根本的解决方法是允许用户自定义数据类型 构造数据类型(复合数据类型)允许用户根据实际需要利用已有的基本数据类型来构造 ...
- ML-Agents(二)创建一个学习环境
ML-Agents(二)创建一个学习环境 一.前言 上一节我们讲了如何配置ML-Agents环境,这一节我们创建一个示例,主要利用Reinforcement Learning(强化学习). 如上图,本 ...