使用DataContractJsonSerializer类将类型实例序列化为JSON字符串
一、JSON简介JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。 JSON是“名值对”的集合。结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'“”'组成,包含的数据类型有Object,Number,Boolean,String,Array,NULL等。 JSON具有以下的形式: 对象(Object)是一个无序的“名值对”集合,一个对象以”{”开始,”}”结束。每个“名”后跟着一个”:”,多个“名值对”由逗号分隔。如: {"FirstName":"Jason","LastName":"Chen"} 数组(Array)是值的有序集合,一个数组以“[”开始,以“]”结束,值之间使用“,”分隔。如: [{"FirstName":"Jason","LastName":"Chen"},{"FirstName":"Jason","LastName":"Chen"}] 字符串(String)是由双引号包围的任意数量的Unicode字符的集合,使用反斜线转义。 二、对JSON数据进行序列化和反序列化可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。 利用DataContractJsonSerializer序列化和反序列化的代码: using System; using System.IO; using System.Runtime.Serialization.Json; using System.Text; using System.Text.RegularExpressions; /* * DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下, * .NET Framework 3.5包含在System.ServiceModel.Web.dll中; * .NET Framework 4.0包含在System.Runtime.Serialization中。 * create by cjj on 2014-10-08;email:ijasonchen91@sina.com<span style="font-family: Arial,Helvetica,sans-serif;">。</span> */ namespace mob.json { /// <summary> /// JSON序列化和反序列化辅助类 /// </summary> public class JsonHelper { /// <summary> /// JSON序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public static string Serialize<T>(T t) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(); serializer.WriteObject(ms,t); string jsonString = Encoding.Default.GetString(ms.ToArray()); ms.Close(); jsonString = ConvertToDateTimeString(jsonString); return jsonString; } /// <summary> /// JSON反序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="jsonString"></param> /// <returns></returns> public static T Deserialize<T>(string jsonString) { jsonString = ConvertToJsonDateTimeString(jsonString); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)); T obj = (T)serializer.ReadObject(ms); ms.Close(); return obj; } /// <summary> /// 将"/Date(673286400000+0800)/"Json时间格式替换"yyyy-MM-dd HH:mm:ss"格式的字符串 /// </summary> /// <param name="jsonDateTimeString">"/Date(673286400000+0800)/"Json时间格式</param> /// <returns></returns> private static string ConvertToDateTimeString(string jsonDateTimeString) { string result = string.Empty; string p = @"/Date((d+)+d+)/"; MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); Regex reg = new Regex(p); result = reg.Replace(jsonDateTimeString,matchEvaluator); return result; } private static string ConvertJsonDateToDateString(Match match) { string result = string.Empty; DateTime dt = new DateTime(1970,1,1); dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)); dt = dt.ToLocalTime(); result = dt.ToString("yyyy-MM-dd HH:mm:ss"); return result; } /// <summary> /// 将"yyyy-MM-dd HH:mm:ss"格式的字符串替换"/Date(673286400000+0800)/"Json时间格式 /// </summary> /// <param name="dateTimeString">"yyyy-MM-dd HH:mm:ss"格式的字符串</param> /// <returns></returns> private static string ConvertToJsonDateTimeString(string dateTimeString) { string result = string.Empty; string p = @"d{4}-d{2}-d{2}sd{2}:d{2}:d{2}"; MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); Regex reg = new Regex(p); result = reg.Replace(dateTimeString,matchEvaluator); return result; } private static string ConvertDateStringToJsonDate(Match match) { string result = string.Empty; DateTime dt = DateTime.Parse(match.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: [DataContract] public class Person { public Person() { } public Person(string firstname,string lastname,DateTime birthday) { this.FirstName = firstname; this.LastName = lastname; this.Birthday = birthday; } [DataMember] public string FirstName { get; set; } [DataMember] public string LastName { get; set; } [DataMember] public DateTime Birthday { get; set; } } 序列化为JSON字符串: private void Serialize() { Person p = new Person("Jason","Chen",Convert.ToDateTime("1991-05-04")); string jsonString = JsonHelper.Serialize<Person>(p); Response.Write(jsonString); } 输出结果: {"Birthday":"1991-05-04 00:00:00","FirstName":"Jason","LastName":"Chen"} 反序列化 private static void Deserialize() { string jsonString = "{"FirstName":"Jason","LastName":"Chen","Birthday":"1991-05-04 00:00:00"}"; Person p = JsonHelper.Deserialize<Person>(jsonString); }运行结果:
三、JSON序列化集合、字典、数组的处理在JSON数据中,所有的集合、字典和数组都表示为数组。 List<T> 序列化 :
private void Serialize() { List<Person> list = new List<Person>(){ new Person("Jason",Convert.ToDateTime("1991-05-04")),new Person("Jack",Convert.ToDateTime("1991-05-05")) }; string jsonString = JsonHelper.Serialize<List<Person>>(list); Response.Write(jsonString); } 序列化结果: [{"Birthday":"1991-05-04 00:00:00",{"Birthday":"1991-05-05 00:00:00","FirstName":"Jack","LastName":"Chen"}] Dictionary字典转化为JSON,如: private void Serialize() { Dictionary<string,string> dic = new Dictionary<string,string>(); dic.Add("FirstName","Jason"); dic.Add("LastName","Chen"); string jsonString = JsonHelper.Serialize<Dictionary<string,string>>(dic); Response.Write(jsonString); } 序列化结果: [{"Key":"FirstName","Value":"Jason"},{"Key":"LastName","Value":"Chen"}] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |