C#(99):JSON与对象的序列化与反序列化
一、利用Web服务中的JavaScriptSerializer 类
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类:DataContractJsonSerializer
System.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://www.newtonsoft.com/json
Json.Net(一)介绍:https://www.cnblogs.com/springsnow/p/10605359.html
五、JSON序列化过程中日期的处理
1、在c#后台进行处理:通过正则表示式
System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer(); Listlist = 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);
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
https://www.newtonsoft.com/json/help/html/JsonNetVsDotNetSerializers.htm
性能对比:
功能对比:
特性 | 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 | 支持 | 不支持 | 不支持 |
posted on 2018-08-06 22:43 springsnow 阅读(267) 评论(0) 编辑 收藏 举报