您的位置:首页 > Web前端 > JavaScript

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

2013-05-07 15:06 501 查看
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; }

}

Person p = new Person();

p.Name = "张三";

p.Age = 28;

p.LastLoginTime = DateTime.Now;

string jsonString = JsonHelper.JsonSerializer<Person>(p);


序列化结果:
{"Age":28,"LastLoginTime":"//Date(1294499956278+0800)//","Name":"张三"}

1 、在后台使用正则表达式对其替换处理。修改JsonHelper:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Runtime.Serialization.Json;

using System.IO;

using System.Text;

using System.Text.RegularExpressions;

/// <summary>

/// JSON序列化和反序列化辅助类

/// </summary>

public 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+/)///"; /*////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;

}

}

序列化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);


运行结果:



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

2、利用JavaScript处理

[javascript] view
plaincopy

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐