using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Runtime.Serialization.Json;
using
System.ServiceModel.Web;
using
System.IO;
using
System.Text;
using
System.Text.RegularExpressions;
namespace
DemoLibrary
{
public
class
JsonManage
{
/// <summary>
/// JSON序列化
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
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();
string
pattern =
@"\\/Date\((\d+)\+\d+\)\\/"
;
MatchEvaluator matchEvaluator =
new
MatchEvaluator(ConvertJsonDateToDateString);
Regex reg =
new
Regex(pattern);
jsonString = reg.Replace(jsonString, matchEvaluator);
return
jsonString;
}
/// <summary>
/// JSON反序列化
/// </summary>
/// <param name="jsonString"></param>
/// <returns></returns>
public
static
T JsonDeserialize<T>(
string
jsonString)
{
string
pattern =
@"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"
;
MatchEvaluator matchEvaluator =
new
MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg =
new
Regex(pattern);
jsonString = reg.Replace(jsonString, matchEvaluator);
DataContractJsonSerializer ser =
new
DataContractJsonSerializer(
typeof
(Person));
MemoryStream ms =
new
MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return
obj;
}
/// <summary>
/// 将Json序列化的时间由/Date(1304931520336+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;
}
}
}