C#對(duì)JSON與對(duì)象的序列化與反序列化
一、利用Web服務(wù)中的JavaScriptSerializer 類
System.Web.Script.Serialization空間,位于System.Web.extensions.dll中。
JavaScriptSerializer jss = new JavaScriptSerializer(); Console.WriteLine(jss.MaxJsonLength); //默認(rèn)接受最大的長度是 2097152 這個(gè)是接受JSON字符串的最大長度,超長會(huì)有什么后果呢?試下 Person p = new Person(1, "關(guān)羽", 21); //序列化 string json = jss.Serialize(p); Console.WriteLine(json); //輸出 {"Id":1,"Name":"關(guān)羽","Age":21}`這就是Json格式了 //反序列化:1、Deserialize泛型寫法 Person p2 = jss.Deserialize("{\"Id\":1,\"Name\":\"關(guān)羽\",\"Age\":21}"); Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age); //輸出 1 關(guān)羽 21 //反序列化:2、Deserialize的非泛型寫法 Person p3 = jss.Deserialize("{\"Id\":1,\"Name\":\"關(guān)羽\",\"Age\":21}", typeof(Person)) as Person; //注意這個(gè)方法返回的是object類,因此要強(qiáng)制轉(zhuǎn)換成Person類 Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age); //同樣輸出 1 關(guān)羽 21 //反序列化:3、將Json字符轉(zhuǎn)換為Object類型 object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"關(guān)羽\",\"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)); //最常用的兩個(gè)方法 //反序列化 string str = "{\"Id\":1,\"Name\":\"劉備\",\"Age\":\"23\"}"; Person p; using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str))) //構(gòu)造函數(shù)能夠接受Stream參數(shù),因此你可以用內(nèi)存流,文件流等等創(chuàng)建 { p = serializer.ReadObject(ms) as Person; } Console.WriteLine(p.Name); //輸出劉備 //反序列化 Person p2 = new Person(2, "關(guān)羽", 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":"關(guān)羽"} } [DataContract] //對(duì)于使用DataContractJsonSerializer類而言,該屬性是必須的 public class Person { public Person(int id, string name, int age) { Id = id; Age = age; Name = name; } [DataMember] //對(duì)于使用DataContractJsonSerializer類而言,該屬性是必須的 public int Id { get; set; } [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } }
三、轉(zhuǎn)換規(guī)則
- String,char =>string
- DBNull,null=>null,"null"
- Boolean=>trur/false
- int,Double,...=>Number
- DateTime..=>"\/Date(刻度數(shù))\/" ,即用“\/”包含。
eg:\/Data(13009188803)\/ - 枚舉數(shù)=>整數(shù)值 eg:Color.Red=>3
- List ,Arrary,ArrayLIst,=>JSON 數(shù)組
eg:new String[]{"2","2","3"}=>["1","2","3"] - Dictionary,HashTable =>JSON對(duì)象
eg:new Dictionary { { 1, "a" }, { 2, "b" }, { 3, "c" } } => {1:"a",2:"b",3:"c"} - 具有公共實(shí)例屬性或字段的非抽象類 =>JSON對(duì)象
注意:公共只寫屬性,以及標(biāo)記[ScriptIgnore]或[IgnoreDataMember]的屬性、字段或?qū)傩詫⒈缓雎浴?nbsp;
eg: {1:"a",2:"b",3:"c"} 好包括”_type“屬性。
四、利用Json.Net三方工具
https://www.newtonsoft.com/json
Json.Net介紹://www.dbjr.com.cn/article/247911.htm
五、JSON序列化過程中日期的處理
1、在c#后臺(tái)進(jìn)行處理:通過正則表示式
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 = "宋興柱 是個(gè)好孩\"子,這里\"有英文逗號(hào)" }); 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"); });
原本內(nèi)容:[{"age":10,"date":"\/Date(1404098342309)\/","name":"宋興柱 是個(gè)好孩\"子,這里\"有英文逗號(hào)"}]
顯示結(jié)果:[{"age":10,"date":"2014-06-30 11:22:15","name":"宋興柱 是個(gè)好孩\"子,這里\"有英文逗號(hào)"}]
2、Json.Net中使用IsoDateTimeConverter格式自定義
IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'月'dd'日'" }; string json = JsonConvert.SerializeObject(jack, dtConverter);
3、在JS中進(jìn)行處理:
接收json數(shù)據(jù),日期格式為:"\/Date(1414078309687)\/"
var value = "/Date(1414078309687)/"; var da = eval('new ' + value.replace('/', '', 'g')); //或者 var da = value.replace(/\/Date\((\d+)\)\//gi, '$1'); ////通過正則拿到里面數(shù)。g 全局 i不區(qū)分大小寫 da.toLocaleDateString() //2014/10/23 da.toLocaleTimeString() //下午11:31:49
六、Json.NET 對(duì)比 NET Serializers
性能對(duì)比:
功能對(duì)比:
特性 | 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轉(zhuǎn)換 | 支持 | 不支持 | 不支持 |
序列化DataTable和DataSet | 支持 | 不支持 | 不支持 |
序列化Entity Framework | 支持 | 不支持 | 不支持 |
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在Winform動(dòng)態(tài)啟動(dòng)、控制臺(tái)命令行的方法
winForm 程序輸出類型為 windows 程序(不是命令行程序)在運(yùn)行時(shí)想輸入一些信息編譯開發(fā)調(diào)試,如何實(shí)現(xiàn)這一功能2013-02-02將Qt項(xiàng)目升級(jí)到Qt6吐血經(jīng)驗(yàn)總結(jié)
很多朋友向小編反饋將Qt項(xiàng)目升級(jí)到Qt6頻繁出錯(cuò),該如何處理呢,今天小編給大家?guī)砹藢t項(xiàng)目升級(jí)到Qt6吐血經(jīng)驗(yàn)總結(jié),感興趣的朋友一起看看吧2021-07-07C#中如何將MongoDB->RunCommand結(jié)果映射到業(yè)務(wù)類的方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于C#中如何將MongoDB->RunCommand結(jié)果映射到業(yè)務(wù)類的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2018-04-04C#利用OpenCvSharp實(shí)現(xiàn)玉米粒計(jì)數(shù)
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合OpenCVSharp4實(shí)現(xiàn)玉米粒計(jì)數(shù),文中的示例代碼簡潔易懂,具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考下2023-11-11C# 如何實(shí)現(xiàn)一個(gè)帶通知的List<T>
這篇文章主要介紹了C# 如何實(shí)現(xiàn)一個(gè)帶通知的List<T>,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02