西安海伦春天暖气问题,JSON问题,怎么解决

Json日期格式问题的四种解决方法(超详细)
作者:张果
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Json日期格式问题的四种解决方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示:
//设置服务器响应的结果为纯文本格式
context.Response.ContentType = "text/plain";
//学生对象集合
List&Student& students = new List&Student&
new Student(){Name ="Tom",
Birthday =Convert.ToDateTime(" 12:12:12")},
new Student(){Name ="Rose",
Birthday =Convert.ToDateTime(" 11:12:12")},
new Student(){Name ="Mark",
Birthday =Convert.ToDateTime(" 10:12:12")}
//javascript序列化器
JavaScriptSerializer jss=new JavaScriptSerializer();
//序列化学生集合对象得到json字符
string studentsJson=jss.Serialize(students);
//将字符串响应到客户端
context.Response.Write(studentsJson);
context.Response.End();
运行结果是:
其中Tom所对应生日“”变成了0,这其实是1970 年 1 月 1 日至今的毫秒数;0//24/365=44.11年,44+年,按这种方法可以得出年月日时分秒和毫秒。这种格式是一种可行的表示形式但不是普通人可以看懂的友好格式,怎么让这个格式变化?
解决办法:
方法1:在服务器端将日期格式使用Select方法或LINQ表达式转换后发到客户端:
using System.Collections.G
using System.W
using System.Web.Script.S
namespace JsonDate1
using System.L
/// &summary&
/// 学生类,测试用
/// &/summary&
public class Student
/// &summary&
/// &/summary&
public String Name { }
/// &summary&
/// &/summary&
public DateTime Birthday { }
/// &summary&
/// 返回学生集合的json字符
/// &/summary&
public class GetJson : IHttpHandler
public void ProcessRequest(HttpContext context)
//设置服务器响应的结果为纯文本格式
context.Response.ContentType = "text/plain";
//学生对象集合
List&Student& students = new List&Student&
new Student(){Name ="Tom",Birthday =Convert.ToDateTime(" 12:12:12")},
new Student(){Name ="Rose",Birthday =Convert.ToDateTime(" 11:12:12")},
new Student(){Name ="Mark",Birthday =Convert.ToDateTime(" 10:12:12")}
//使用Select方法重新投影对象集合将Birthday属性转换成一个新的属性
//注意属性变化后要重新命名,并立即执行
var studentSet =
students.Select
p =& new { p.Name, Birthday = p.Birthday.ToString("yyyy-mm-dd") }
).ToList();
//javascript序列化器
JavaScriptSerializer jss = new JavaScriptSerializer();
//序列化学生集合对象得到json字符
string studentsJson = jss.Serialize(studentSet);
//将字符串响应到客户端
context.Response.Write(studentsJson);
context.Response.End();
public bool IsReusable
Select方法重新投影对象集合将Birthday属性转换成一个新的属性,注意属性变化后要重新命名,属性名可以相同;这里可以使用select方法也可以使用LINQ查询表达式,也可以选择别的方式达到相同的目的;这种办法可以将集合中客户端不用的属性剔除,达到简单优化性能的目的。
运行结果:
这时候的日期格式就已经变成友好格式了,不过在javascript中这只是一个字符串。
在javascript中将"Birthday":"\/Date(0)\/"中的字符串转换成javascript中的日期对象,可以将Birthday这个Key所对应的Value中的非数字字符以替换的方式删除,到到一个数字0,然后实例化一个Date对象,将0毫秒作为参数,得到一个javascript中的日期对象,代码如下:
&!DOCTYPE html&
&html xmlns="http://www.w3.org/1999/xhtml"&
&title&json日期格式处理&/title&
&script src="Scripts/jquery-1.10.2.min.js" type="text/javascript"&&/script&
&script type="text/javascript"&
$(function() {
$.getJSON("getJson.ashx", function (students) {
$.each(students, function (index, obj) {
$("&li/&").html(obj.Name).appendTo("#ulStudents");
//使用正则表达式将生日属性中的非数字(\D)删除
//并把得到的毫秒数转换成数字类型
var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));
//实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数
var birthday = new Date(birthdayMilliseconds);
$("&li/&").html(birthday.toLocaleString()).appendTo("#ulStudents"); ;
&h2&json日期格式处理&/h2&
&ul id="ulStudents"&
运行结果:
上的使用正则/\D/igm达到替换所有非数字的目的,\D表示非数字,igm是参数,分别表示忽视(ignore)大小写;多次、全局(global)替换;多行替换(multi-line);有一些时候还会出现+86的情况,只需要变换正则同样可以达到目的。另外如果项目中反复出现这种需要处理日期格式的问题,可以扩展一个javascript方法,代码如下:
$(function () {
$.getJSON("getJson.ashx", function (students) {
$.each(students, function (index, obj) {
$("&li/&").html(obj.Name).appendTo("#ulStudents");
//使用正则表达式将生日属性中的非数字(\D)删除
//并把得到的毫秒数转换成数字类型
var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));
//实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数
var birthday = new Date(birthdayMilliseconds);
$("&li/&").html(birthday.toLocaleString()).appendTo("#ulStudents");
$("&li/&").html(obj.Birthday.toDate()).appendTo("#ulStudents");
//在String对象中扩展一个toDate方法,可以根据要求完善
String.prototype.toDate = function () {
if (isNaN(this)) {
//使用正则表达式将日期属性中的非数字(\D)删除
dateMilliseconds =this.replace(/\D/igm, "");
dateMilliseconds=
//实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数
return new Date(parseInt(dateMilliseconds));
&& 上面扩展的方法toDate不一定合理,也不够强大,可以根据需要修改。
可以选择一些第三方的json工具类,其中不乏有一些已经对日期格式问题已处理好了的,常见的json序列化与反序列化工具库有:
1.fastJSON.
2.JSON_checker.
3.Jayrock.
4.Json.NET - LINQ to JSON.
5.LitJSON.
6.JSON for .NET.
8.JSONSharp.
9.JsonExSerializer.
10.fluent-json
11.Manatee Json
这里以litjson为序列化与反序列化json的工具类作示例,代码如下:
using System.Collections.G
using System.W
using LitJ
namespace JsonDate2
using System.L
/// &summary&
/// 学生类,测试用
/// &/summary&
public class Student
/// &summary&
/// &/summary&
public String Name { }
/// &summary&
/// &/summary&
public DateTime Birthday { }
/// &summary&
/// 返回学生集合的json字符
/// &/summary&
public class GetJson : IHttpHandler
public void ProcessRequest(HttpContext context)
//设置服务器响应的结果为纯文本格式
context.Response.ContentType = "text/plain";
//学生对象集合
List&Student& students = new List&Student&
new Student(){Name ="Tom",Birthday =Convert.ToDateTime(" 12:12:12")},
new Student(){Name ="Rose",Birthday =Convert.ToDateTime(" 11:12:12")},
new Student(){Name ="Mark",Birthday =Convert.ToDateTime(" 10:12:12")}
//序列化学生集合对象得到json字符
string studentsJson = JsonMapper.ToJson(students);
//将字符串响应到客户端
context.Response.Write(studentsJson);
context.Response.End();
public bool IsReusable
运行结果如下:
这时候的日期格式就基本正确了,只要在javascript中直接实例化日期就好了,
var date = new Date("01/31/:12");
alert(date.toLocaleString());
客户端的代码如下:
$(function () {
$.getJSON("GetJson2.ashx", function (students) {
$.each(students, function (index, obj) {
$("&li/&").html(obj.Name).appendTo("#ulStudents");
var birthday = new Date(obj.Birthday);
$("&li/&").html(birthday.toLocaleString()).appendTo("#ulStudents");
var date = new Date("01/31/:12");
alert(date.toLocaleString());
这点文字发到博客上有网友提出了他们宝贵的意见,我并没有考虑在MVC中的情况,其实MVC中也可以使用handler,所以区别不是很大了,但MVC中有专门针对服务器响应为JSON的Action,代码如下:
using System.Web.M
namespace JSONDateMVC.Controllers
public class HomeController : Controller
public JsonResult GetJson1()
//序列化当前日期与时间对象,并允许客户端Get请求
return Json(DateTime.Now, JsonRequestBehavior.AllowGet);
运行结果:
下载一个内容为Application/json的文件,文件名为GetJson1,内容是"\/Date(4)\/"
从上面的情况看来MVC中序列化时并未对日期格式特别处理,我们可以反编译看源码:
Return调用的Json方法:
protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
return this.Json(data, null, null, behavior);
this.Json方法
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
return new JsonResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior };
JsonResult类ActionResult类的子类,ExecuteResult方法:
从上面的代码中不难看出微软的JsonResult类仍然是使用了JavaScriptSerializer,所以返回的结果与方法一未处理时是一样的,要解决这个问题我们可以派生出一个新的类,重写ExecuteResult方法,使用Json.net来完成序列化工作,JsonResultPro.cs文件的代码如下:
using System.W
using System.Web.M
using Newtonsoft.J
using Newtonsoft.Json.C
public class JsonResultPro : JsonResult
public JsonResultPro(){}
public JsonResultPro(object data, JsonRequestBehavior behavior)
base.Data =
base.JsonRequestBehavior =
this.DateTimeFormat = "yyyy-MM-dd hh:mm:ss";
public JsonResultPro(object data, String dateTimeFormat)
base.Data =
base.JsonRequestBehavior = JsonRequestBehavior.AllowG
this.DateTimeFormat = dateTimeF
/// &summary&
/// 日期格式
/// &/summary&
public string DateTimeFormat{ }
public override void ExecuteResult(ControllerContext context)
if (context == null)
throw new ArgumentNullException("context");
if ((this.JsonRequestBehavior == JsonRequestBehavior.DenyGet) && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("MvcResources.JsonRequest_GetNotAllowed");
HttpResponseBase base2 = context.HttpContext.R
if (!string.IsNullOrEmpty(this.ContentType))
base2.ContentType = this.ContentT
base2.ContentType = "application/json";
if (this.ContentEncoding != null)
base2.ContentEncoding = this.ContentE
if (this.Data != null)
//转换System.DateTime的日期格式到 ISO 8601日期格式
//ISO 8601 (如T12:53Z)
IsoDateTimeConverter isoDateTimeConverter=new IsoDateTimeConverter();
//设置日期格式
isoDateTimeConverter.DateTimeFormat = DateTimeF
String jsonResult = JsonConvert.SerializeObject(this.Data,isoDateTimeConverter);
//相应结果
base2.Write(jsonResult);
使用上面的JsonResultPro Action类型的代码如下:
public JsonResultPro GetJson2()
//序列化当前日期与时间对象,并允许客户端Get请求,注意H是大写
return new JsonResultPro(DateTime.Now,"yyyy-MM-dd HH:mm");
运行结果:
这样就可以完全按自己的意思来设置日期格式了,但需要注意日期格式如平时的Format是有区别的,如这里表示时间的H如果大写表示24小时制,如果小写表示12小时制。另外还有几个问题要问大家:
1、通过Reflector反编译得到的代码中有很多变化,如属性会变成get_Request()方法的形式,不知道大家有没有更好的方法。
2、在反编译得到的代码中使用到了资源文件MvcResources.JsonRequest_GetNotAllowed,怎么在重写时也可以使用?
以上所述是小编给大家介绍的Json日期格式问题的四种解决方法小结(超详细),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具关于U方法返回json问题求解决! - ThinkPHP框架
&&&&&&&&&&&&&&&&$proj['uid']&&&&&&&&&&&&=&&&&$
&&&&&&&&&&&&&&&&$proj['proj_mgr_uid']&&&&=&&&&$
&&&&&&&&&&&&&&&&$proj['proj_ctime']&&&&&&&&=&&&&$_SERVER['REQUEST_TIME'];
&&&&&&&&&&&&&&&&if(M('Project')-&add($proj)){
&&&&&&&&&&&&&&&&&&&&$this-&success('提交成功!',U('Caiwu/myProj'),1);
&&&&&&&&&&&&&&&&}else{
&&&&&&&&&&&&&&&&&&&&$this-&error('提交失败!请刷新后再试');
&&&&&&&&&&&&&&&&}如上,提交本应该跳转到list页面,结果直接在浏览器上打印json如下。
{&info&:&\u63d0\u4ea4\uf\uff01&,&status&:1,&url&:&\/index.php\/Caiwu\/myProj&}
另外:success(‘提交成功’,“__APP__/xxx/xxx”)也会打印上面的json。
通过检查,本页面没有接收json的语句。
求解决!!!
补充一下:用的是普通form提交方式,并未使用ajax方式。
积分:1709
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。}

我要回帖

更多关于 春天思果阅读问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信