System.Web.Script.Serialization空间,位于System.Web.extensions.dll中。
JavaScriptSerializer jss = new JavaScriptSerializer(); Console.WriteLine(jss.MaxJsonLength); //默认接受最大的长度是 2097152 这个是接受JSON字符串的最大长度,超长会有什么后果呢?试下 Person p = new Person(1, "关羽", 21); //序列化 string json = jss.Serialize(p); Console.WriteLine(json); //输出 {"Id":1,"Name":"关羽","Age":21}`这就是Json格式了 //反序列化:1、Deserialize泛型写法 Person p2 = jss.Deserialize("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}"); Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age); //输出 1 关羽 21 //反序列化:2、Deserialize的非泛型写法 Person p3 = jss.Deserialize("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}", typeof(Person)) as Person; //注意这个方法返回的是object类,因此要强制转换成Person类 Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age); //同样输出 1 关羽 21 //反序列化:3、将Json字符转换为Object类型 object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}"); Person p4 = jss.ConvertToType(obj); Console.WriteLine(p4.Name); Person p5 = jss.ConvertToType(obj, typeof(Person)) as Person; Console.WriteLine(p5.Name); public class Person { public Person() { } public Person(int id, string name, int age) { this.Id = id; this.Name = name; this.Age = age; } public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
二、利用WCF中的JSON类:DataContractJsonSerializerSystem.Runtine.Serialization命名空间中,位于System.Runtine,Serialization.dll中。
void Main() { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Person)); //最常用的两个方法 //反序列化 string str = "{\"Id\":1,\"Name\":\"刘备\",\"Age\":\"23\"}"; Person p; using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str))) //构造函数能够接受Stream参数,因此你可以用内存流,文件流等等创建 { p = serializer.ReadObject(ms) as Person; } Console.WriteLine(p.Name); //输出刘备 //反序列化 Person p2 = new Person(2, "关羽", 23); byte[] byteArr; using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, p2); byteArr = ms.ToArray(); } Console.WriteLine(Encoding.UTF8.GetString(byteArr)); //输出 {"Age":23,"Id":1,"Name":"关羽"} } [DataContract] //对于使用DataContractJsonSerializer类而言,该属性是必须的 public class Person { public Person(int id, string name, int age) { Id = id; Age = age; Name = name; } [DataMember] //对于使用DataContractJsonSerializer类而言,该属性是必须的 public int Id { get; set; } [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } }
三、转换规则 String,char =>string DBNull,null=>null,"null" Boolean=>trur/false int,Double,...=>Number DateTime..=>"\/Date(刻度数)\/" ,即用[\/]包含。 eg:\/Data(13009188803)\/ 枚举数=>整数值 eg:Color.Red=>3 List ,Arrary,ArrayLIst,=>JSON 数组 eg:new String[]{"2","2","3"}=>["1","2","3"] Dictionary,HashTable =>JSON对象 eg:new Dictionary { { 1, "a" }, { 2, "b" }, { 3, "c" } } => {1:"a",2:"b",3:"c"} 具有公共实例属性或字段的非抽象类 =>JSON对象 注意:公共只写属性,以及标记[ScriptIgnore]或[IgnoreDataMember]的属性、字段或属性将被忽略。 eg: {1:"a",2:"b",3:"c"} 好包括]_type[属性。 四、利用Json.Net三方工具https://HdhCmsTestnewtonsoft测试数据/json
Json.Net介绍: //HdhCmsTestjb51.net/article/247911.htm
五、JSON序列化过程中日期的处理 1、在c#后台进行处理:通过正则表示式System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer(); List list = new List(); list.Add(new Student() { age = 10, date = DateTime.Now, name = "宋兴柱 是个好孩\"子,这里\"有英文逗号" }); var str = js.Serialize(list); str = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match => { DateTime dt = new DateTime(1970, 1, 1); dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)).ToLocalTime(); return dt.ToString("yyyy-MM-dd HH:mm:ss"); });
原本内容:[{"age":10,"date":"\/Date(1404098342309)\/","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}] 显示结果:[{"age":10,"date":"2014-06-30 11:22:15","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}]
2、Json.Net中使用IsoDateTimeConverter格式自定义IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'月'dd'日'" }; string json = JsonConvert.SerializeObject(jack, dtConverter);
参考:Json.Net高级用法
3、在JS中进行处理:接收json数据,日期格式为:"\/Date(1414078309687)\/"
var value = "/Date(1414078309687)/"; var da = eval('new ' + value.replace('/', '', 'g')); //或者 var da = value.replace(/\/Date\((\d+)\)\//gi, '$1'); ////通过正则拿到里面数。g 全局 i不区分大小写 da.toLocaleDateString() //2014/10/23 da.toLocaleTimeString() //下午11:31:49
六、Json.NET 对比 NET Serializers性能对比:
功能对比:
特性 Json.Net DataContractJsonSerializer JavaScriptSerializer Json 支持 支持 支持 Bson 支持 不支持 不支持 Json Schema 支持 不支持 不支持 .Net 2.0 支持 不支持 不支持 .Net 3.5 支持 支持 支持 .Net 4.0 支持 支持 支持 Silverlight 支持 支持 不支持 Windows Phone 支持 支持 不支持 Windows 8 Metro 支持 支持 不支持 Linq to Json 支持 不支持 不支持 Indented Json(有换行格式的Json) 支持 不支持 不支持 Json和XML转换 支持 不支持 不支持 序列化DataTable和DataSet 支持 不支持 不支持 序列化Entity Framework 支持 不支持 不支持以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
查看更多关于C#对JSON与对象的序列化与反序列化的详细内容...