json序列化和反序列化时间类型的字符串

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

 

1.方法一:

JavaScript 写法
function ChangeDateFormat(jsondate) {
  jsondate = jsondate.replace("/Date(", "").replace(")/", "");
  if (jsondate.indexOf("+") > 0) {
    jsondate = jsondate.substring(0, jsondate.indexOf("+"));
  }
  else if (jsondate.indexOf("-") > 0) {
    jsondate = jsondate.substring(0, jsondate.indexOf("-"));
  }

  var date = new Date(parseInt(jsondate, 10));
  var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
  var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
  return date.getFullYear() + "-" + month + "-" + currentDate;
}

调取方法(将Json序列化的时间由/Date(1294499956278+0800))转为字符串

例如:ChangeDateFormat("//Date(1294499956278+0800)//");

 

2.方法二:
jsonHelper 写法(在控制器后台的写法)

将Json序列化的时间由/Date(1294499956278+0800)转为字符串 

修改Person类,添加LastLoginTime:

 

  1. public class Person  
  2. {     
  3. public string Name { get; set; }     
  4. public int Age { get; set; }  
  5. public DateTime LastLoginTime { get; set; }     
  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); 

控制器中(代码如下)

  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.  }  

 

 序列化Demo:

Person p = new Person();     

p.Name = "张三";     

p.Age = 28;     

p.LastLoginTime = DateTime.Now;    

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);


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

本文摘自http://blog.csdn.net/cncdns/article/details/6164389 cncdns的专栏


转载于:https://www.cnblogs.com/Trant-Z/p/5364257.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值