序列化(Serialize)是將對(duì)象轉(zhuǎn)換成字節(jié)流,并將其用于存儲(chǔ)或傳輸?shù)倪^程,主要用途是保存對(duì)象的狀態(tài),以便在需要時(shí)重新創(chuàng)建該對(duì)象唐片;反序列化(Deserialize)則是將上面的字節(jié)流轉(zhuǎn)換為相應(yīng)對(duì)象的過程;在.Net陣營(yíng)中涨颜,Json.Net是由官方推薦的高性能開源序列化/反序列化工具费韭,其官方網(wǎng)站:?https://www.newtonsoft.com/json?;
一庭瑰、將對(duì)象序列化為Json格式字符串
首先是正常的序列化操作星持,對(duì)于給定的類:
privateclassMyClass{publicintMyNum;publicstringMyStr;}
將該類的實(shí)例序列化為Json格式字符串,首先引用命名空間Newtonsoft.Json:
MyClass myClass =newMyClass { MyNum =10, MyStr ="Hello World"};Console.WriteLine(JsonConvert.SerializeObject(myClass));
其打印結(jié)果:
{"MyNum":10,"MyStr":"Hello World"}
在打印到本地Log文件以供自己查看使用時(shí)弹灭,可以選擇轉(zhuǎn)換為帶有縮進(jìn)的Json格式字符串:
Console.WriteLine(JsonConvert.SerializeObject(myClass,Formatting.Indented));
此時(shí)打印結(jié)果為:
{"MyNum":10,"MyStr":"Hello World"}
二督暂、將Json格式字符串反序列化為對(duì)象
對(duì)于給定的字符串:
stringjsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";
將其反序列化為MyClass類型的對(duì)象:
MyClass myClass = JsonConvert.DeserializeObject(jsonStr);Console.WriteLine(myClass.MyStr);//Hello World
三、使用JObject動(dòng)態(tài)序列化/反序列化
以上例子都是使用強(qiáng)類型進(jìn)行序列化和反序列操作穷吮,但有時(shí)也會(huì)用到不指定類型而直接操作Json格式數(shù)據(jù)的情況逻翁,此時(shí)就需要用位于命名空間ewtonsoft.Json.Linq中的JObject類型的對(duì)象:
string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";JObject jObject = JObject.Parse(jsonStr);Console.WriteLine(jObject.ToString(Formatting.None));//{"MyNum":10,"MyStr":"Hello World"}//打印一條屬性的值Console.WriteLine(jObject["MyStr"].Value());//Hello World//添加一條屬性jObject.Add("MyStr2","HaHa");//打印當(dāng)前Json字符串Console.WriteLine(jObject.ToString(Formatting.None));//{"MyNum":10,"MyStr":"Hello World","MyStr2":"HaHa"}
四、定制化序列化/反序列過程
1.在C#中捡鱼,定制化的配置通常使用特性來完成八回,這里也不例外,例如簡(jiǎn)單的,在序列化/反序列時(shí)忽略某個(gè)字段/屬性:
privateclassMyClass{? ? [JsonIgnore]publicintMyNum;publicstringMyStr;}
此時(shí)辽社,無論序列化還是反序化時(shí)伟墙,字段MyNum都不再參與這些過程翘鸭;
2.自定義某個(gè)字段/屬性的序列化/反序列化規(guī)則:
當(dāng)接收到的Json格式字符串與本地已有類型不統(tǒng)一時(shí)滴铅,需要進(jìn)行自定義的反序列化過程,反之亦然就乓,例如Json字符串中以字符串"TRUE"表示布爾類型true(不自定義汉匙,這個(gè)過程依然走的通,只是以此舉例)生蚁,以字符串"FALSE"表示布爾類型false時(shí)噩翠,需要自定義如下:
///<summary>///自定義布爾類型數(shù)據(jù)轉(zhuǎn)換規(guī)則///</summary>publicclassMyBoolConverter:JsonConverter{privateconststringTrueStr ="TRUE";privateconststringFalseStr ="FALSE";publicoverrideboolCanConvert(Type objectType)=>true;//反序列化publicoverrideobjectReadJson(JsonReader reader, Type objectType,objectexistingValue, JsonSerializer serializer){if(reader.ValueType ==typeof(string))? ? ? ? {if((string)reader.Value == TrueStr)? ? ? ? ? ? {returntrue;? ? ? ? ? ? }else{returnfalse;? ? ? ? ? ? }? ? ? ? }returnfalse;? ? }//序列化publicoverridevoidWriteJson(JsonWriter writer,objectvalue, JsonSerializer serializer){if(value.GetType() ==typeof(bool))? ? ? ? {boolresult = (bool)value;if(result)? ? ? ? ? ? {? ? ? ? ? ? ? ? writer.WriteValue(TrueStr);? ? ? ? ? ? }else{? ? ? ? ? ? ? ? writer.WriteValue(FalseStr);? ? ? ? ? ? }? ? ? ? }? ? }}
然后,在需要操作的類型定義中的字段/屬性中加入該特性:
privateclassMyClass{? ? [JsonConverter(typeof(MyBoolConverter))]publicboolMyBool;}
此時(shí):
string jsonStr = @"{""MyBool"": ""TRUE""}";MyClass1 myClass = JsonConvert.DeserializeObject(jsonStr);Console.WriteLine(myClass.MyBool);//TrueConsole.WriteLine(JsonConvert.SerializeObject(myClass));//{"MyBool":"TRUE"}
看我主頁簡(jiǎn)介免費(fèi)C++學(xué)習(xí)資源邦投,視頻教程伤锚、職業(yè)規(guī)劃、面試詳解志衣、學(xué)習(xí)路線屯援、開發(fā)工具
每晚8點(diǎn)直播講解C++編程技術(shù)。非常感謝大家的關(guān)注