在开发中,有时需要从服务器返回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 serializer JavaScript serializer jss=new JAVAScript serializer();//序列化学生集合对象得到json字符串students JSON=jss.serialize(学生);//响应字符串到客户端context.response.write(学生JSON);语境。响应. End();运行结果是:
其中,汤姆的生日“2014年1月31日”变成了1391141532000,这其实是1970年1月1日以来的毫秒数。391141532000/1000/60/60/24/365=44.11年,44 1970=2014年。根据这种方法,可以得到年、月、日的时间、分钟和毫秒。这种格式是一种可行的表示,但不是普通人可以理解的友好格式。我们如何改变这种格式?解决方案:方法一:在服务器端使用Select方法或LINQ表达式转换日期格式并发送给客户端:复制代码如下:使用System使用系统。集合。通用;使用系统。Web使用系统。Web.Script .序列化;使用System命名空间JsonDate1 {。Linq///summary ///学生类,用于测试////summary public class学生{///summary///name/////summary public string name { get;设置;}///summary////生日////summary public datetime生日{ get设置;} }///summary////返回学生集合////summary公共类getjs : ihttphandler { public void process request(httpcontext context){//}的json字符。将服务器响应的结果设置为纯文本格式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 . Select(p=new { p . name,生日=p .生日. tostring ('yyyy-mm-DD')})。to list();//JavaScript serializer JavaScript serializer jss=new JAVAScript serializer();//序列化学生集合对象得到json字符串学生JSON=jss.serialize(学生集合);//响应字符串到客户端context.response.write(学生JSON);语境。响应. End();} public bool IsReuse { get { return false;} } } } select方法重新投影对象集合,以将生日属性转换为新属性。请注意,属性更改后应该重命名,属性名称可以相同;您可以在这里使用select方法或LINQ查询表达式,也可以选择其他方式来达到相同的目的。该方法可以消除集合中客户端未使用的属性,达到简单优化性能的目的。运行结果:
此时,日期格式变得友好,但它只是javascript中的一个字符串。方法二:在javascript中,将“生日”:' /date (1391141532000) /'中的字符串转换为javascript中的日期对象,可以替换删除Key“生日”对应的Value中的非数字字符,直到达到数字1391141532000。然后实例化一个date对象,以1391141532000毫秒为参数,在javascript中得到一个Date对象。代码如下:复制代码如下:键入html xmlns=' http://www.w3.org/1999/XHTML'标题JSON日期格式处理/标题脚本src=' http 3360 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结果:。
使用常规/D/igm on替换所有非数字,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 . Jay rock . 4 . JSON . net-linq to JSON . 5 . litjson . 6 . JSON for . net . 7 . jsonfx . 8 . jsonsharp . 9 . jsonexserializer . 10 .流利-json 11。ManageeJSON这里使用litjson作为工具类对JSON进行序列化和反序列化,代码如下:复制代码如下:using System使用系统。集合。通用;使用系统。Web使用LitJson使用System命名空间JsonDate2 {。Linq///summary ///学生类,用于测试////summary public class学生{///summary///name/////summary public string name { get;设置;}///summary////生日////summary public datetime生日{ get设置;} }///summary////返回学生集合////summary公共类getjs : ihttphandler { public void process request(httpcontext context){//}的json字符。将服务器响应的结果设置为纯文本格式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 ')} };//序列化学生集合对象,得到json字符串students JSON=JSON macper . to JSON(students);//响应字符串到客户端context.response.write(学生JSON);语境。响应. End();} public bool IsReuse { get { return false;}}}}运行结果如下:。
此时日期格式基本正确,只要在javascript中直接实例化日期,var date=new date(' 01/31/201412336012336012 ');alert(date . ToLocalString());客户端代码如下:复制代码如下: $ (function () {$)。getjson ('getjson2.ashx ',函数(学生){$。每个(学生,函数(index,obj) {$ ('li/')。html (obj.name)。追加。var生日=新日期(对象。生日);$('li/')。html(生日. birthday.toLocaleString())。appendo(' # ulStudents ');});});});var date=新日期(' 01/31/2014 12:12:12 ');alert(date . ToLocalString());json中有三种方法可以解决序列化后的日期格式问题。应该有更好更完善的方法。请告诉我。我写这篇课文是因为很多学生问我。我欢迎批评和纠正。示例代码下载