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

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

public class Person
{   
public string Name { get; set; }   
public int Age { get; set; }
public DateTime LastLoginTime { get; set; }   
 }

 

序列化結果
{"Age":28,"LastLoginTime":"//Date(1294499956278+0800)//","Name":"张三"}
1 、在后台使用正则表达式对其替换处理。修改JsonHelper:
using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.RegularExpressions;


namespace Lib.EM.Common
{
    /// <summary>  
    /// JSON序列化和反序列化辅助类  
    /// </summary>  
    public static class JsonHelper
    {
        /// <summary>  
        /// JSON序列化  
        /// </summary>  
        public static string JsonSerializer<T>(T t)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream();
            ser.WriteObject(ms, t);
            string jsonString = Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();
            //替换Json的Date字符串  
            string p = @"\\/Date\((\d+)\+\d+\)\\/"; // p = @"///Date/((/d+)/+/d+/)///"; /*Date/((([/+/-]/d+)|(/d+))[/+/-]/d+/)*/
            MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
            Regex reg = new Regex(p);
            jsonString = reg.Replace(jsonString, matchEvaluator);
            return jsonString;
        }
        /// <summary>  
        /// JSON反序列化  
        /// </summary>  
        public static T JsonDeserialize<T>(string jsonString)
        {
            //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"//Date(1294499956278+0800)//"格式  
            string p = @"/d{4}-/d{2}-/d{2}/s/d{2}:/d{2}:/d{2}";
            MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
            Regex reg = new Regex(p);
            jsonString = reg.Replace(jsonString, matchEvaluator);
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            T obj = (T)ser.ReadObject(ms);
            return obj;
        }

        /// <summary>  
        /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串  
        /// </summary>  
        private static string ConvertJsonDateToDateString(Match m)
        {
            string result = string.Empty;
            DateTime dt = new DateTime(1970, 1, 1);
            dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
            dt = dt.ToLocalTime();
            result = dt.ToString("yyyy-MM-dd HH:mm:ss");
            return result;
        }
        /// <summary>  
        /// 将时间字符串转为Json时间  
        /// </summary>  
        private static string ConvertDateStringToJsonDate(Match m)
        {
            string result = string.Empty;
            DateTime dt = DateTime.Parse(m.Groups[0].Value);
            dt = dt.ToUniversalTime();
            TimeSpan ts = dt - DateTime.Parse("1970-01-01");
            result = string.Format("///Date({0}+0800)///", ts.TotalMilliseconds);
            return result;
        }
    }
}

序列化

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

 2、利用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;  
 }

简单Demo :

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

     结果:

2011-1-8

 

上一篇:pyspark操作hive分区表以及.gz.parquet和part-00000文件压缩问题


下一篇:【无人机导航】复杂环境下的无人机编队路径规划matlab源码