乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【轉(zhuǎn)】在C#中使用Json.Net進(jìn)行序列化和反序列化及定制化

       印度阿三17 2019-05-29

      作者:Minotauros

      原文地址:在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./json;

        一、將對(duì)象序列化為Json格式字符串

        首先是正常的序列化操作,對(duì)于給定的類(lèi):

      private class MyClass
      {
          public int MyNum;
          public string MyStr;
      }

        將該類(lèi)的實(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類(lèi)型的對(duì)象:

      MyClass myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
      Console.WriteLine(myClass.MyStr); //Hello World

        三、使用JObject動(dòng)態(tài)序列化/反序列化

        以上例子都是使用強(qiáng)類(lèi)型進(jìn)行序列化和反序列操作,但有時(shí)也會(huì)用到不指定類(lèi)型而直接操作Json格式數(shù)據(jù)的情況,此時(shí)就需要用位于命名空間ewtonsoft.Json.Linq中的JObject類(lèi)型的對(duì)象:

      復(fù)制代碼
      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"}
      復(fù)制代碼

        四、定制化序列化/反序列過(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格式字符串與本地已有類(lèi)型不統(tǒng)一時(shí),需要進(jìn)行自定義的反序列化過(guò)程,反之亦然,例如Json字符串中以字符串"TRUE"表示布爾類(lèi)型true(不自定義,這個(gè)過(guò)程依然走的通,只是以此舉例),以字符串"FALSE"表示布爾類(lèi)型false時(shí),需要自定義如下:

      復(fù)制代碼
      /// <summary>
      /// 自定義布爾類(lèi)型數(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);
                  }
              }
          }
      }
      復(fù)制代碼

        然后,在需要操作的類(lèi)型定義中的字段/屬性中加入該特性:

      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"}
      來(lái)源:http://www./content-1-213851.html

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多