C#使用Json.Net進(jìn)行序列化和反序列化及定制化
序列化(Serialize)是將對(duì)象轉(zhuǎn)換成字節(jié)流,并將其用于存儲(chǔ)或傳輸?shù)倪^(guò)程,主要用途是保存對(duì)象的狀態(tài),以便在需要時(shí)重新創(chuàng)建該對(duì)象;反序列化(Deserialize)則是將上面的字節(jié)流轉(zhuǎn)換為相應(yīng)對(duì)象的過(guò)程;在.Net陣營(yíng)中,Json.Net是由官方推薦的高性能開(kāi)源序列化/反序列化工具,其官方網(wǎng)站:https://www.newtonsoft.com/json;
一、將對(duì)象序列化為Json格式字符串
首先是正常的序列化操作,對(duì)于給定的類:
private class MyClass { public int MyNum; public string MyStr; }
將該類的實(shí)例序列化為Json格式字符串,首先引用命名空間Newtonsoft.Json:
MyClass myClass = new MyClass { 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ì)于給定的字符串:
string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";
將其反序列化為MyClass類型的對(duì)象:
MyClass myClass = JsonConvert.DeserializeObject<MyClass>(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<string>()); //Hello World //添加一條屬性 jObject.Add("MyStr2", "HaHa"); //打印當(dāng)前Json字符串 Console.WriteLine(jObject.ToString(Formatting.None)); //{"MyNum":10,"MyStr":"Hello World","MyStr2":"HaHa"}
四、定制化序列化/反序列過(guò)程
1.在C#中,定制化的配置通常使用特性來(lái)完成,這里也不例外,例如簡(jiǎn)單的,在序列化/反序列時(shí)忽略某個(gè)字段/屬性:
private class MyClass { [JsonIgnore] public int MyNum; public string MyStr; }
此時(shí),無(wú)論序列化還是反序化時(shí),字段MyNum都不再參與這些過(guò)程;
2.自定義某個(gè)字段/屬性的序列化/反序列化規(guī)則:
當(dāng)接收到的Json格式字符串與本地已有類型不統(tǒng)一時(shí),需要進(jìn)行自定義的反序列化過(guò)程,反之亦然,例如Json字符串中以字符串"TRUE"表示布爾類型true(不自定義,這個(gè)過(guò)程依然走的通,只是以此舉例),以字符串"FALSE"表示布爾類型false時(shí),需要自定義如下:
/// <summary> /// 自定義布爾類型數(shù)據(jù)轉(zhuǎn)換規(guī)則 /// </summary> public class MyBoolConverter : JsonConverter { private const string TrueStr = "TRUE"; private const string FalseStr = "FALSE"; public override bool CanConvert(Type objectType) => true; //反序列化 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.ValueType == typeof(string)) { if ((string)reader.Value == TrueStr) { return true; } else { return false; } } return false; } //序列化 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value.GetType() == typeof(bool)) { bool result = (bool)value; if (result) { writer.WriteValue(TrueStr); } else { writer.WriteValue(FalseStr); } } } }
然后,在需要操作的類型定義中的字段/屬性中加入該特性:
private class MyClass { [JsonConverter(typeof(MyBoolConverter))] public bool MyBool; }
此時(shí):
string jsonStr = @"{""MyBool"": ""TRUE""}"; MyClass1 myClass = JsonConvert.DeserializeObject<MyClass1>(jsonStr); Console.WriteLine(myClass.MyBool); //True Console.WriteLine(JsonConvert.SerializeObject(myClass)); //{"MyBool":"TRUE"}
以上就是本次整理的C#使用Json.Net進(jìn)行序列化和反序列化及定制化全部知識(shí)點(diǎn)內(nèi)容,感謝大家對(duì)腳本之家的支持。
- C#使用Json.Net對(duì)JSON與對(duì)象的序列化與反序列化
- C#對(duì)Json進(jìn)行序列化和反序列化
- C# Newtonsoft.Json 解析多嵌套json 進(jìn)行反序列化的實(shí)例
- C#中Json反序列化的實(shí)現(xiàn)方法
- C#實(shí)現(xiàn)JSON字符串序列化與反序列化的方法
- C#中實(shí)現(xiàn)Json序列化與反序列化的幾種方式
- C#實(shí)現(xiàn)的json序列化和反序列化代碼實(shí)例
- C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼
- C#對(duì)JSON與對(duì)象的序列化與反序列化
相關(guān)文章
winform用datagridview制作課程表實(shí)例
這篇文章主要介紹了winform用datagridview制作課程表的方法,實(shí)例分析了WinForm實(shí)現(xiàn)課程表的結(jié)構(gòu)、數(shù)據(jù)庫(kù)及調(diào)用技巧,需要的朋友可以參考下2015-01-01C#實(shí)現(xiàn)基于任務(wù)的異步編程模式
本文詳細(xì)講解了C#實(shí)現(xiàn)基于任務(wù)的異步編程模式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04oledb連接access數(shù)據(jù)庫(kù)示例
本文為大家介紹一個(gè)oledb連接access數(shù)據(jù)庫(kù)的示例,代碼很簡(jiǎn)單,可以直接使用2014-01-01C#中實(shí)現(xiàn)一次執(zhí)行多條帶GO的sql語(yǔ)句實(shí)例
這篇文章主要介紹了C#中實(shí)現(xiàn)一次執(zhí)行多條帶GO的sql語(yǔ)句,以實(shí)例形式較為詳細(xì)的分析了C#執(zhí)行sql語(yǔ)句的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09C#實(shí)現(xiàn)變量交換、斐波那契數(shù)列、質(zhì)數(shù)、回文方法合集
這篇文章介紹了C#實(shí)現(xiàn)變量交換、斐波那契數(shù)列、質(zhì)數(shù)、回文的方法合集,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02