.net 实体类与json转换(.net自带类库实现)更新
上一篇文章中写到在.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 版本。