MVC Json方法里的一个坑

简介:
+关注继续查看

MVC Controller类下面有这样一个方法

复制代码
      //
        // Summary:
        //     Creates a System.Web.Mvc.JsonResult object that serializes the specified object
        //     to JavaScript Object Notation (JSON).
        //
        // Parameters:
        //   data:
        //     The JavaScript object graph to serialize.
        //
        // Returns:
        //     The JSON result object that serializes the specified object to JSON format. The
        //     result object that is prepared by this method is written to the response by the
        //     ASP.NET MVC framework when the object is executed.
        protected internal JsonResult Json(object data);
复制代码

一般用在Action中返回一个JSON与客户端JS(JQuery)交互。

public JsonResult getRepChangeTest()
        {
            return Json(myobj);
        }

当你的对像里有日期时间字段时,这个Json方法会把它序列化成这种格式

"rec_dt": "/Date(1498466813000)/",

在客户端JS里,我们把它当作字符串处理一下,然后转成js的日期格式,比如

 View Code

可以还原成日期格式,如 2017-06-26 16:46,这一切看上去都很完美,然而,坑就在这里。

Json方法返回的时间戳(毫秒数)是基于UTC时间的(GMT 0),而我的时区是GMT+8,所以这就有了8个小时的时差。

但是 js里的var date = new Date(xxxxx); 这个是基于UTC时间的(测试所得,没深究),所以客户端得到的时间也是正确的。如果你用C#代码这样手动验证一下

DateTime.Parse("1970-1-1").AddSeconds(1498466813)

得到的日期刚好差8个小时。

MySQL中的日期类型有datetime, timestamp,如果使用datetime,如上没有问题(虽然差个时区,但客户端也是基于UTC还原的,所以能得到正确值),但当你使用timestamp时,Json方法序列化后的值是基于当前时区的,这样js客户端用上面的方法还原后就错了,加了8个小时,因为客户端是基于UTC的,对不上。 这是真正的坑所在。从数据库里读出来,C#里调试两个类型的值没差别,都正确,但是把实体对像(定义的类型均为datetime)经Jons方法转换后结果就不同,具体原来待研究……。

 

解决方法

1. 不使用Json转换,用其它的,比如Newtonsoft.Json,经过JsonConvert.SerializeObject(obj)转换后日期已经变成日期样式的字符串格式,直接显示即可。

复制代码
public ContentResult getRepChangeTest2()
        {
            var obj = rptdal.ReportChangeList();
            string json=JsonConvert.SerializeObject(obj);
            return Content(json, "application/json");
        }
复制代码

2. 数据库中不使用timestamp, 改用datetime类型

本文转自chy710博客园博客,原文链接:http://www.cnblogs.com/chy710/p/7083762.html,如需转载请自行联系原作者
相关文章
|
8月前
|
JSON 前端开发 Java
ajax json list spring mvc接收
ajax json list spring mvc接收
|
8月前
|
JSON 前端开发 Java
spring mvc json jackson 配置
spring mvc json jackson 配置
|
8月前
|
JSON 前端开发 Java
|
10月前
|
存储 JSON JavaScript
.NET MVC第九章、Web Api Json序列化与反序列化
.NET MVC第九章、Web Api Json序列化与反序列化
125 0
.NET MVC第九章、Web Api Json序列化与反序列化
|
开发框架 前端开发 .NET
ASP.NET MVC 中使用Highcharts+Ajax+Json生成动态曲线图,柱状图,饼图
ASP.NET MVC 中使用Highcharts+Ajax+Json生成动态曲线图,柱状图,饼图
ASP.NET MVC 中使用Highcharts+Ajax+Json生成动态曲线图,柱状图,饼图
|
JSON 前端开发 Java
Spring MVC基于注解的使用:JSON数据处理
JSON 是一种轻量级的数据交换格式,是一种理想的数据交互语言,它易于阅读和编写,同时也易于机器解析和生成。
196 0
Spring MVC基于注解的使用:JSON数据处理
|
JSON 前端开发 Java
【Spring MVC】(四)Spring MVC响应视图(字符串的方式、ModelAndView 对象、JSON 数据)、统一异常处理(普通请求、AJAX 请求)
【Spring MVC】(四)Spring MVC响应视图(字符串的方式、ModelAndView 对象、JSON 数据)、统一异常处理(普通请求、AJAX 请求)
310 0
【Spring MVC】(四)Spring MVC响应视图(字符串的方式、ModelAndView 对象、JSON 数据)、统一异常处理(普通请求、AJAX 请求)
|
设计模式 JSON 前端开发
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(2)
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
93 0
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(2)
|
设计模式 JSON 前端开发
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(1)
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
97 0
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(1)
|
XML JSON 前端开发
为什么Spring MVC能自动转换json/xml,你研究过它背后的原理吗?
SpringMVC是目前主流的Web MVC框架之一。本文使用的demo基于maven,是根据入门blog的例子继续写下去的。
相关产品
云迁移中心
推荐文章
更多