上一篇文章中寫到在.net中實體類跟json格式的相互轉換,今天在做具體轉換時候,發現之前版本的jsonhelp對於日期類型的轉換不全面。之前版本的jsonhelp中從實體類轉換成json格式時候,將日期格式轉成了時間戳的形式。在這裡對這個jsonhelp做出了更新。以解決轉換日期類型字段的問題。代碼如下:
JsonHelp.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.Serialization.Json; using System.IO; using System.Text.RegularExpressions; namespace JsonTest { class JsonHelp { public JsonHelp() { // // TODO: Add constructor logic here // } /// <summary> /// 把對象序列化 JSON 字符串 /// </summary> /// <typeparam name="T">對象類型</typeparam> /// <param name="obj">對象實體</param> /// <returns>JSON字符串</returns> public static string GetJson<T>(T obj) { //記住 添加引用 System.ServiceModel.Web /** * 如果不添加上面的引用,System.Runtime.Serialization.Json; Json是出不來的哦 * */ DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream()) { json.WriteObject(ms, obj); string jsonString = Encoding.UTF8.GetString(ms.ToArray()); 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> /// <typeparam name="T">對象類型</typeparam> /// <param name="jsonString">JSON字符串</param> /// <returns>對象實體</returns> public static T ParseFormJson<T>(string jsonString) { T obj = Activator.CreateInstance<T>(); 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); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString))) { DataContractJsonSerializer dcj = new DataContractJsonSerializer(typeof(T)); return (T)dcj.ReadObject(ms); } } /// <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; } } }
測試代碼:
using ConsoleApplication1.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { using (var db = new JooWMSContext()) { var admin = db.Admins.Where(p => p.ID > 0).OrderBy(p => p.ID); foreach (var ad in admin) { Console.WriteLine(JsonTest.JsonHelp.GetJson<ConsoleApplication1.Models.Admin>(ad)); } Console.ReadKey(); } } } }
寫測試代碼時候 用到了EF ,這裡推薦一個不錯的工具。EF Power Tools 目前是beta4 版本。