作者:Minotauros 原文地址:在C#中使用Json.Net進行序列化和反序列化及定制化 序列化(Serialize)是將對象轉換成字節(jié)流,并將其用于存儲或傳輸?shù)倪^程,主要用途是保存對象的狀態(tài),以便在需要時重新創(chuàng)建該對象;反序列化(Deserialize)則是將上面的字節(jié)流轉換為相應對象的過程;在.Net陣營中,Json.Net是由官方推薦的高性能開源序列化/反序列化工具,其官方網(wǎng)站:https://www./json; 一、將對象序列化為Json格式字符串 首先是正常的序列化操作,對于給定的類: private class MyClass { public int MyNum; public string MyStr; } 將該類的實例序列化為Json格式字符串,首先引用命名空間Newtonsoft.Json: MyClass myClass = new MyClass { MyNum = 10, MyStr = "Hello World" }; Console.WriteLine(JsonConvert.SerializeObject(myClass)); 其打印結果: {"MyNum":10,"MyStr":"Hello World"} 在打印到本地Log文件以供自己查看使用時,可以選擇轉換為帶有縮進的Json格式字符串: Console.WriteLine(JsonConvert.SerializeObject(myClass, Formatting.Indented)); 此時打印結果為: { "MyNum": 10, "MyStr": "Hello World" } 二、將Json格式字符串反序列化為對象 對于給定的字符串: string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}"; 將其反序列化為MyClass類型的對象: MyClass myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr); 三、使用JObject動態(tài)序列化/反序列化 以上例子都是使用強類型進行序列化和反序列操作,但有時也會用到不指定類型而直接操作Json格式數(shù)據(jù)的情況,此時就需要用位于命名空間ewtonsoft.Json.Linq中的JObject類型的對象: ![]() 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 ![]() 四、定制化序列化/反序列過程 1.在C#中,定制化的配置通常使用特性來完成,這里也不例外,例如簡單的,在序列化/反序列時忽略某個字段/屬性: private class MyClass { [JsonIgnore] public int MyNum; public string MyStr; } 此時,無論序列化還是反序化時,字段MyNum都不再參與這些過程; 2.自定義某個字段/屬性的序列化/反序列化規(guī)則: 當接收到的Json格式字符串與本地已有類型不統(tǒng)一時,需要進行自定義的反序列化過程,反之亦然,例如Json字符串中以字符串"TRUE"表示布爾類型true(不自定義,這個過程依然走的通,只是以此舉例),以字符串"FALSE"表示布爾類型false時,需要自定義如下: ![]() /// <summary> /// 自定義布爾類型數(shù)據(jù)轉換規(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; } 此時: string jsonStr = @"{""MyBool"": ""TRUE""}"; MyClass1 myClass = JsonConvert.DeserializeObject<MyClass1>(jsonStr); Console.WriteLine(myClass.MyBool); //True Console.WriteLine(JsonConvert.SerializeObject(myClass)); //{"MyBool":"TRUE"}來源:http://www./content-1-213851.html |
|