JSON序列化和反序列化日期时间的处理

JSON格式不直接支持日期和时间。DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“+0500”的部分可选,它指示该时间属于Local类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为Utc。

  1. public class Person  
  2. {     
  3. public string Name { getset; }     
  4. public int Age { getset; }  
  5. public DateTime LastLoginTime { getset; }     
  6.  }  
  1. Person p = new Person();     
  2. p.Name = "张三";     
  3. p.Age = 28;     
  4. p.LastLoginTime = DateTime.Now;     
  5. string jsonString = JsonHelper.JsonSerializer<Person>(p);  

序列化结果:

{"Age":28,"LastLoginTime":"//Date(1294499956278+0800)//","Name":"张三"}
 1 、在后台使用正则表达式对其替换处理。修改JsonHelper:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;     
  5. using System.Runtime.Serialization.Json;     
  6. using System.IO;     
  7. using System.Text;     
  8. using System.Text.RegularExpressions;     
  9. /// <summary>    
  10. /// JSON序列化和反序列化辅助类    
  11. /// </summary>    
  12. public class JsonHelper    
  13. {    
  14.      /// <summary>    
  15.     /// JSON序列化    
  16.     /// </summary>    
  17.      public static string JsonSerializer<T>(T t)    
  18.      {    
  19.          DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));    
  20.          MemoryStream ms = new MemoryStream();    
  21.         ser.WriteObject(ms, t);    
  22.          string jsonString = Encoding.UTF8.GetString(ms.ToArray());    
  23.          ms.Close();    
  24.          //替换Json的Date字符串    
  25.          string p = @"///Date/((/d+)/+/d+/)///"/*Date/((([/+/-]/d+)|(/d+))[/+/-]/d+/)*/  
  26.          MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);    
  27.           Regex reg = new Regex(p);    
  28.          jsonString = reg.Replace(jsonString, matchEvaluator);    
  29.          return jsonString;    
  30.      }    
  31.      /// <summary>    
  32.      /// JSON反序列化    
  33.      /// </summary>    
  34.      public static T JsonDeserialize<T>(string jsonString)    
  35.      {    
  36.          //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"//Date(1294499956278+0800)//"格式    
  37.          string p = @"/d{4}-/d{2}-/d{2}/s/d{2}:/d{2}:/d{2}";    
  38.         MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);    
  39.         Regex reg = new Regex(p);    
  40.          jsonString = reg.Replace(jsonString, matchEvaluator);    
  41.          DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));    
  42.         MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));    
  43.          T obj = (T)ser.ReadObject(ms);    
  44.          return obj;    
  45.      }    
  46.       
  47.      /// <summary>    
  48.      /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串    
  49.      /// </summary>    
  50.      private static string ConvertJsonDateToDateString(Match m)    
  51.      {    
  52.          string result = string.Empty;    
  53.          DateTime dt = new DateTime(1970,1,1);    
  54.          dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));    
  55.          dt = dt.ToLocalTime();    
  56.          result = dt.ToString("yyyy-MM-dd HH:mm:ss");    
  57.         return result;    
  58.      }    
  59.      /// <summary>    
  60.      /// 将时间字符串转为Json时间    
  61.      /// </summary>    
  62.      private static string ConvertDateStringToJsonDate(Match m)    
  63.      {    
  64.          string result = string.Empty;    
  65.          DateTime dt = DateTime.Parse(m.Groups[0].Value);    
  66.          dt = dt.ToUniversalTime();    
  67.          TimeSpan ts = dt - DateTime.Parse("1970-01-01");    
  68.          result = string.Format("///Date({0}+0800)///",ts.TotalMilliseconds);    
  69.         return result;    
  70.     }    
  71.  }  
  1. 序列化Demo:
  2. Person p = new Person();     
  3. p.Name = "张三";     
  4. p.Age = 28;     
  5. p.LastLoginTime = DateTime.Now;    
  6. string jsonString = JsonHelper.JsonSerializer<Person>(p); 

运行结果:

{"Age":28,"LastLoginTime":"2011-01-09 01:00:56","Name":"张三"}

 反序列化Demo:

string json = "{/"Age/":28,/"LastLoginTime/":/"2011-01-09 00:30:00/",/"Name/":/"张三/"}";
p=JsonHelper.JsonDeserialize<Person>(json);

运行结果:

在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。

     2、利用JavaScript处理

[javascript]  view plain copy
  1. function ChangeDateFormat(jsondate) {     
  2.     jsondate = jsondate.replace("/Date(""").replace(")/""");     
  3.     if (jsondate.indexOf("+") > 0) {    
  4.         jsondate = jsondate.substring(0, jsondate.indexOf("+"));     
  5.     }     
  6.      else if (jsondate.indexOf("-") > 0) {    
  7.          jsondate = jsondate.substring(0, jsondate.indexOf("-"));     
  8.      }     
  9.      
  10.     var date = new Date(parseInt(jsondate, 10));   
  11.      var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;    
  12.      var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();    
  13.      return date.getFullYear() + "-" + month + "-" + currentDate;    
  14.  }  

简单Demo :

ChangeDateFormat("//Date(1294499956278+0800)//");

     结果:

2011-1-8


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值