手机版

Json日期格式问题的四种解决方案(超详细)

时间:2021-09-05 来源:互联网 编辑:宝哥软件园 浏览:

在开发中,有时需要从服务器返回json格式的数据。如果后台代码中有DateTime类型的数据,那么在被系统自带的工具类序列化后,会得到一个长数字来表示日期数据,如下所示:

//将服务器响应的结果设置为纯文本格式context . response . content type=' text/plain ';//学生对象集list students=new list student { new student(){ name=' Tom ',生日=convert。today time(' 2014-01-31 12:12336012 ')},new Student(){Name='Rose ',生日=Convert。今日时间(' 2014-01-10 11:12:12')},新学生(){姓名='Mark ',生日=Convert。today time(' 2014-01-09 10:12:12 ')} };//javascript序列化程序jss=new JavaScript序列化程序();//序列化学生集合对象得到json字符串students JSON=jss.serialize(学生);//响应字符串到客户端context.response.write(学生JSON);语境。响应. End();运行结果如下:

其中,汤姆的生日“2014年1月31日”变成了1391141532000,这其实是1970年1月1日以来的毫秒数;1391141532000/1000/60/60/24/365=44.11年,44 1970=2014年。根据这种方法,可以得到年、月、日的时间、分钟和毫秒。这种格式是一种可行的表示,但不是普通人可以理解的友好格式。我们如何改变这种格式?

解决方法:

方法1:在服务器端,使用Select方法或LINQ表达式转换日期格式,然后发送到客户端:

使用系统;使用系统。集合。通用;使用系统。Web使用系统。Web.Script .序列化;使用System命名空间JsonDate1 {。Linq///summary ///student class,////summary public class student {///summary///name////summary public string name { get;设置;}///summary////生日////summary public datetime生日{ get设置;} }///summary////返回学生集合的json字符////summary公共类getjs : ihttphandler { public void process request(httpcontext){//将服务器响应的结果设置为纯文本格式context . response . content type=' text/plain ';//学生对象集list students=new list student { new student(){ name=' Tom ',生日=convert。today time(' 2014-01-31 12:12336012 ')},new Student(){Name='Rose ',生日=Convert。今日时间(' 2014-01-10 11:12:12')},新学生(){姓名='Mark ',生日=Convert。today time(' 2014-01-09 10:12:12 ')} };//使用Select方法对对象集进行重投影,将生日属性转换为新属性//注意属性更改后重命名,立即执行var students set=students。选择(p=新{p.name,生日=p .生日. tostring ('yyyy-mm-DD')})。to list();//javascript序列化程序jss=new JavaScript序列化程序();//序列化学生集合对象得到json字符串学生JSON=jss.serialize(学生集合);//响应字符串到客户端context.response.write(学生JSON);语境。响应. End();} public bool IsReuse { get { return false;} } } } select方法重新投影对象集合,以将生日属性转换为新属性。注意属性更改后要重命名,属性名称可以相同;您可以在这里使用select方法或LINQ查询表达式,也可以选择其他方式来达到相同的目的;该方法可以消除集合中客户端未使用的属性,达到简单优化性能的目的。

运行结果:

此时,日期格式变得友好,但它只是javascript中的一个字符串。

方法2:

在javascript中,将“生日”:' \/Date (1391141532000) \/'中的字符串转换为javascript中的日期对象,通过替换为数字1391141532000,可以删除“生日的关键”对应的Value中的非数字字符,然后实例化一个Date对象,替换为139112000。

!doctype html xmlns=' http://www.w3.org/1999/XHTML'标题JSON日期格式处理/标题脚本src=' http : scripts/jquery-1 . 10 . 2 . min . js ' type=' text/JavaScript '/脚本脚本类型=' text/JavaScript ' $(function(){ $)。getJSON('getJson.ashx ',函数(学生){ $。每个(学生,函数(index,obj) { $('li/')。html(obj。姓名)。appendo(' # ulStudents ');//使用正则表达式删除生日属性//中的非数字(\D),并将获得的毫秒数转换为数字类型var生日毫秒数=par sent(obj . birthday . replace(/\ D/IgM ' '));//实例化一个新的日期格式,使用从1970年1月1日到现在的毫秒作为参数var生日=新日期(生日毫秒);$('li/')。html(生日. birthday.toLocaleString())。appendo(' # ulStudents ');});});});/script/headbody h2json日期格式处理/h2ul id=' ulstudents '/ul/body/html run结果:

On,正则/\D/igm用于替换所有非数字,\D表示非数字,igm为参数,表示忽略大小写;多个全局替换;多线替换(多线);有时候会出现86例,改变规律性才能达到目的。此外,如果处理日期格式的问题在项目中反复出现,您可以用以下代码扩展javascript方法:

$(function () { $)。getJSON('getJson.ashx ',函数(学生){ $。每个(学生,函数(index,obj) { $('li/')。html(obj。姓名)。appendo(' # ulStudents ');//使用正则表达式删除生日属性//中的非数字(\D),并将获得的毫秒数转换为数字类型var生日毫秒数=par sent(obj . birthday . replace(/\ D/IgM ' '));//实例化一个新的日期格式,使用从1970年1月1日到现在的毫秒作为参数var生日=新日期(生日毫秒);$('li/')。html(生日. birthday.toLocaleString())。appendo(' # ulStudents ');$('li/')。html(obj。生日. today())。appendo(' # ulStudents ');});});});//在String对象中扩展一个toDate方法,可以改进String . prototype . toDate=function(){ var date毫秒;If (isNaN(this)) {//使用正则表达式删除日期属性中的非数字(\D)。日期毫秒=这个。替换(/\ d/IgM ' ');} else { dateMilliseconds=this}//实例化一个新的日期格式,使用从1970年1月1日到现在的毫秒作为参数返回新的日期(parsent(date毫秒));};上面扩展的toDate方法不一定合理或足够强大,可以根据需要进行修改。

方法3:

您可以选择一些第三方json工具类,其中一些已经处理了日期格式问题。常见的json序列化和反序列化工具库有:

1 . FastJSon . 2 . JSON _ checker . 3 . JayRock . 4 . Json . NET-LINQ转JSON . 5 . LitJSON . 6 . JSON for . NET . 7 . JSonfx . 8 . JSonsSharp . 9 . JSoneXSerializer . 10 . fluent-JSon11。海牛Json

这里,将litjson作为序列化和反序列化json的工具类,代码如下:

使用系统;使用系统。集合。通用;使用系统网络.使用LitJson使用系统命名空间JsonDate2 { .Linq///摘要///学生类,测试用////总结公开课学生{ ///总结///姓名////摘要公共字符串名称{获取设置;} ///摘要///生日////汇总公共日期时间生日{获取设置;} } ///摘要///返回学生集合的json字符////摘要公共类GetJson : IHttpHandler { public void process request(HttpContext上下文)上下文){ //设置服务器响应的结果为纯文本格式语境。响应。内容类型='文本/纯文本;//学生对象集合列表学生=新列表学生{新学生(){姓名='汤姆,生日=转换。今日时间(' 2014-01-31 12:12:12')},新学生(){姓名='玫瑰',生日=转换.今日时间(' 2014-01-10 11:12:12')},新学生(){姓名='标记',生日=转换.今日时间(' 2014-01-09 10:12:12 ')} };//序列化学生集合对象得到json字符string studentsJson=JsonMapper .ToJson(学生);//将字符串响应到客户端语境。回应。写(学生JSON);语境。响应。end();} public bool IsReuse { get { return false;} } }}运行结果如下:

这时候的日期格式就基本正确了,只要在爪哇岛描述语言中直接实例化日期就好了,

var日期=新日期(' 01/31/2014 12:12:12 ');警报(日期。ToLocalString());客户端的代码如下:

$(function () { $).getJSON('GetJson2.ashx ',函数(学生){ $。每个(学生,函数(索引,对象){ $('li/').html(obj .姓名)。appendo(' # ulStudents ');定义变量生日=新日期(对象。生日);$('li/').html(生日。生日. birthday.toLocaleString()).appendo(' # ulStudents ');});});});var日期=新日期(' 01/31/2014 12:12:12 ');警报(日期。ToLocalString());方法四:

这点文字发到博客上有网友提出了他们宝贵的意见,我并没有考虑在手动音量调节中的情况,其实手动音量调节中也可以使用汉德勒,所以区别不是很大了,但手动音量调节中有专门针对服务器响应为JSON的行动,代码如下:

使用系统;使用系统网络。手动音量调节命名空间JSONDateMVC .控制器{公共类家庭控制器:控制器{公共JsonResult GetJson1() { //序列化当前日期与时间对象,并允许客户端得到请求返回Json(DateTime .现在,JsonRequestBehavior .允许get);} }}运行结果:

下载一个内容为应用程序/json的文件,文件名为GetJson1,内容是\/日期(1391418272884)\/'

从上面的情况看来手动音量调节中序列化时并未对日期格式特别处理,我们可以反编译看源码:

返回调用的Json方法:

受保护的内部JsonResult Json(对象数据,JsonRequestBehavior返回此Json(数据,null,null,行为);}这个Json .方法受保护的内部虚拟JsonResult Json(对象数据,字符串contentType,Encoding contentEncoding,JsonRequestBehavior){ 0返回新的JsonResult {数据=数据,ContentType=contentType,content Encoding=内容Encoding,JsonRequestBehavior=behavior };}JsonResult类操作结果类的子类,ExecuteResult方法:

从上面的代码中不难看出微软的JsonResult类仍然是使用了Java Script语言序列化程序,所以返回的结果与方法一未处理时是一样的,要解决这个问题我们可以派生出一个新的类,重写ExecuteResult方法,使用Json.net来完成序列化工作,JsonResultPro.cs文件的代码如下:

命名空间JSONDateMVC .常用{使用系统;使用系统网络.使用系统网络。手动音量调节使用牛顿英尺.Json使用牛顿英尺.转换器;公共类JsonResultPro : JsonResult { public JsonResultPro()} { public JsonResultPro(对象数据,JsonRequestBehavior .数据=数据;基地JsonRequestBehavior=行为;这个日期时间格式=' yyyy-MM-DD hh :MM :s ';} public JsonResultPro(对象数据,字符串dateTimeFormat) { base .数据=数据;基地JsonRequestBehavior=JsonRequestBehavior .允许获取这个datetime format=datetime format }///摘要///日期格式////汇总公共字符串DateTimeFormat { get设置;}公共覆盖void ExecuteResult(ControllerContext)上下文上下文){ if(context==null){ 0引发新的ArgumentNullException('上下文');} if(这个JsonRequestBehavior==JsonRequestBehavior .DenyGet)字符串等于(上下文HttpContext .请求. HttpMethod,' GET ',StringComparison .ordinalignorcase)){ 0抛出新的无效的操作异常(' MvcResources .JsonRequest _ GetNotAllowed’);} HttpResponseBase base2=上下文。响应;if(!字符串IsNullOrEmpty(这ContentType)) { base2 .ContentType=这个.ContentType} else { base2 .内容类型=' application/JSON ';}如果(这个ContentEncoding!=null) { base2 .内容编码=这个.内容编码}如果(这个。数据!=null) { //转换系统。日期时间的日期格式到国际标准化组织8601日期格式//ISO 8601(如2008-04-12T12:53Z)等日期时间转换器等日期时间转换器=新等日期时间转换器();//设置日期格式等日期时间转换器datetime format=datetime format//序列化字符串jsonResult=JsonConvert .SerializeObject(这。数据,等日期时间转换器);//相应结果基数2 .write(jsonResult);} } }}使用上面的JsonResultPro操作类型的代码如下:

public JsonResultPro GetJson2(){//序列化当前日期与时间对象,并允许客户端得到请求,注意H是大写返回新的JsonResultPro(DateTime .现在,' yyyy-MM-DD hh :MM ';}运行结果:

'2014-02-03 18:10'

这样就可以完全按自己的意思来设置日期格式了,但需要注意日期格式如平时的格式是有区别的,如这里表示时间的H如果大写表示24小时制,如果小写表示12小时制。另外还有几个问题要问大家:

1、通过反射镜反编译得到的代码中有很多变化,如属性会变成get_Request()方法的形式,不知道大家有没有更好的方法。

2、在反编译得到的代码中使用到了资源文件MvcResources .JsonRequest_GetNotAllowed,怎么在重写时也可以使用?

以上所述是小编给大家介绍的Json日期格式问题的四种解决方法小结(超详细),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

版权声明:Json日期格式问题的四种解决方案(超详细)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。