国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#使用Json.Net進行序列化和反序列化及定制化

2020-01-24 00:05:05
字體:
來源:轉載
供稿:網友

序列化(Serialize)是將對象轉換成字節流,并將其用于存儲或傳輸的過程,主要用途是保存對象的狀態,以便在需要時重新創建該對象;反序列化(Deserialize)則是將上面的字節流轉換為相應對象的過程;在.Net陣營中,Json.Net是由官方推薦的高性能開源序列化/反序列化工具,其官方網站:https://www.newtonsoft.com/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);Console.WriteLine(myClass.MyStr); //Hello World

三、使用JObject動態序列化/反序列化

以上例子都是使用強類型進行序列化和反序列操作,但有時也會用到不指定類型而直接操作Json格式數據的情況,此時就需要用位于命名空間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//添加一條屬性jObject.Add("MyStr2", "HaHa");//打印當前Json字符串Console.WriteLine(jObject.ToString(Formatting.None)); //{"MyNum":10,"MyStr":"Hello World","MyStr2":"HaHa"}

四、定制化序列化/反序列過程

1.在C#中,定制化的配置通常使用特性來完成,這里也不例外,例如簡單的,在序列化/反序列時忽略某個字段/屬性:

private class MyClass{  [JsonIgnore]  public int MyNum;  public string MyStr;}

此時,無論序列化還是反序化時,字段MyNum都不再參與這些過程;

2.自定義某個字段/屬性的序列化/反序列化規則:

當接收到的Json格式字符串與本地已有類型不統一時,需要進行自定義的反序列化過程,反之亦然,例如Json字符串中以字符串"TRUE"表示布爾類型true(不自定義,這個過程依然走的通,只是以此舉例),以字符串"FALSE"表示布爾類型false時,需要自定義如下:

/// <summary>/// 自定義布爾類型數據轉換規則/// </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); //TrueConsole.WriteLine(JsonConvert.SerializeObject(myClass)); //{"MyBool":"TRUE"}

以上就是本次整理的C#使用Json.Net進行序列化和反序列化及定制化全部知識點內容,感謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴林左旗| 集安市| 许昌县| 安徽省| 开封县| 塘沽区| 临朐县| 柳林县| 进贤县| 景泰县| 容城县| 高青县| 满洲里市| 襄樊市| 定边县| 炎陵县| 龙泉市| 城口县| 来安县| 勃利县| 望奎县| 郴州市| 凤台县| 华安县| 苍南县| 象州县| 延吉市| 望江县| 景东| 辽阳市| 赤峰市| 台湾省| 阿合奇县| 河东区| 平江县| 资中县| 南华县| 通山县| 荣成市| 扎囊县| 冷水江市|