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 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题的更多相关文章

  1. 解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题

    问题背景: 在使用asp.net mvc 结合jquery esayui做一个系统,但是在使用使用this.json方法直接返回一个json对象,在列表中显示时发现datetime类型的数据在转为字符 ...

  2. 用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题

    当用ajax异步时,返回JsonResult格式的时候,发现当字段是dateTime类型时,返回的json格式既然是“/Date(1435542121135)/” 这样子的,当然这不是我们想要的格式. ...

  3. mybatis会自动把字段名中的下划线转为驼峰命名法?

    先看一下转化的调用堆栈: 代码如下: 上面代码只是去掉了下划线,并没有首字母小写变大写的代码.再跟进findProperty方法可以找到获取驼峰结果的代码如下: 可以看出通过reflector.fin ...

  4. 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数

    [问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...

  5. 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds

    RSS全称Really Simple Syndication.一些更新频率较高的网站可以通过RSS让订阅者快速获取更新信息.RSS文档需遵守XML规范的,其中必需包含标题.链接.描述信息,还可以包含发 ...

  6. 在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录

    在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录 前言 最近有个Web项目,业务功能不复杂,但是这个客户(某政府部门)有两个硬性要求:1 ...

  7. Asp.net MVC 4新项目中创建area的后续操作

    Asp.net MVC 4新项目中创建area后,往往HomeController与area的HomeController路由发生混淆,需要手工设置一些地方避免mvc无法识别默认路由的状况. 无废话具 ...

  8. 解决Win10系统下 C# DateTime 出现星期几的问题 解决ASP.NET MVC 接受Request Playload参数问题

    解决Win10系统下 C# DateTime 出现星期几的问题 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToStri ...

  9. java和数据库中日期类型的常见用法

    (1)java中日期类型:Date.Timestamp(2)数据库中:Date.Timestamp(3)字符串和Date之间的格式化转换:    SimpleDateFormat类方法: format ...

随机推荐

  1. libra共识算法分析

    ​​ 核心算法说明 基于chained实现,整体上是当前轮推动下一轮共识继续下去, 如此来持续运转下去, 数据有效性证明基于(QC)实现 leader广播proposal消息{round, qc, p ...

  2. FSBPM流程引擎(002)之表单+自定义流程挂载到引擎

    本章节介绍如何将实际业务的表单和自定义流程挂载到FSBPM流程引擎上. 首先进入引擎交互界面: 点击创建:->出差申请 然后根据实际的业务输入对应的数据项即可,比如[姓名,部门,开始时间,结束时 ...

  3. JavaMail(一):利用JavaMail发送简单邮件

    JavaMail,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.但它并没有包含在JDK中,要使用JavaMail首先要下载ja ...

  4. Python数据科学手册(2) NumPy入门

    NumPy(Numerical Python 的简称)提供了高效存储和操作密集数据缓存的接口.在某些方面,NumPy 数组与 Python 内置的列表类型非常相似.但是随着数组在维度上变大,NumPy ...

  5. vscode C++ 程序 windows

    vscode 1.42.1 OS: windows 7 x64 1. vscode, cpp extension 本文直接跳过 vscode 安装, Cpp tools 安装 2. MinGw 安装及 ...

  6. gulp VS grunt

    前公司代码一直用grunt部署, 偶然了解gulp后:学习gulp并用gulp和grunt在一小项目中实践,对两者之间的用法及区别有所了解后总结这一篇小博文:本文根据实战的项目配置文件,简单讲解实现相 ...

  7. 【牛客】乃爱与城市拥挤程度 — 树形dp,up and down

    我太难了 这题做得我要死了,来来回回写了大概八九个小时 错误的原因要么是快速幂写错(一生之敌,要么是忘取模爆\(longlong\)变负数\(QAQ\) \(update\) \(2019.11.13 ...

  8. Angular入门之环境搭建(VS code)(转载)

    安装Visual Studio Code VS code和我们常用的VS压根不是一回事,它只是一个开源的轻量级编辑器,而不是IDE,因为支持typescript语法,且插件功能丰富,所以选择 官网下载 ...

  9. Python习题集(一)

    每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! 题目 有一个数据list of dict如下 a = [ {"}, {"}, {"}, ] 写入到本 ...

  10. HTTP 与 HTTPS 的区别以及 HTTPS 建立连接的过程

    HTTP 与 HTTPS 区别 HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好. 使用 HTTPS 协议需要到 CA(Certifi ...