C#使用Json.Net進(jìn)行序列化和反序列化及定制化
序列化(Serialize)是將對象轉(zhuǎn)換成字節(jié)流,并將其用于存儲或傳輸?shù)倪^程,主要用途是保存對象的狀態(tài),以便在需要時重新創(chuàng)建該對象;反序列化(Deserialize)則是將上面的字節(jié)流轉(zhuǎn)換為相應(yīng)對象的過程;在.Net陣營中,Json.Net是由官方推薦的高性能開源序列化/反序列化工具,其官方網(wǎng)站:https://www.newtonsoft.com/json;
一、將對象序列化為Json格式字符串
首先是正常的序列化操作,對于給定的類:
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文件以供自己查看使用時,可以選擇轉(zhuǎn)換為帶有縮進(jìn)的Json格式字符串:
Console.WriteLine(JsonConvert.SerializeObject(myClass, Formatting.Indented));
此時打印結(jié)果為:
{
 "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動態(tài)序列化/反序列化
以上例子都是使用強(qiáng)類型進(jìn)行序列化和反序列操作,但有時也會用到不指定類型而直接操作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
//添加一條屬性
jObject.Add("MyStr2", "HaHa");
//打印當(dāng)前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.自定義某個字段/屬性的序列化/反序列化規(guī)則:
當(dāng)接收到的Json格式字符串與本地已有類型不統(tǒng)一時,需要進(jìn)行自定義的反序列化過程,反之亦然,例如Json字符串中以字符串"TRUE"表示布爾類型true(不自定義,這個過程依然走的通,只是以此舉例),以字符串"FALSE"表示布爾類型false時,需要自定義如下:
/// <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;
}
此時:
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)行序列化和反序列化及定制化全部知識點(diǎn)內(nèi)容,感謝大家對我們的支持。
上一篇:C#使用FileStream復(fù)制一個任意文件
欄 目:C#教程
下一篇:C#實(shí)現(xiàn)炫酷啟動圖-動態(tài)進(jìn)度條效果
本文標(biāo)題:C#使用Json.Net進(jìn)行序列化和反序列化及定制化
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/4754.html
您可能感興趣的文章
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動對資源的釋放
 - 01-10C#3.0使用EventLog類寫Windows事件日志的方法
 - 01-10C#使用windows服務(wù)開啟應(yīng)用程序的方法
 - 01-10c# ArrayList的使用方法小總結(jié)
 - 01-10C#使用ADO.Net部件來訪問Access數(shù)據(jù)庫的方法
 - 01-10C#使用Mutex簡單實(shí)現(xiàn)程序單實(shí)例運(yùn)行的方法
 - 01-10使用Nopcommerce為商城添加滿XX減XX優(yōu)惠券功能
 - 01-10C#中yield用法使用說明
 - 01-10C#編程和Visual Studio使用技巧(下)
 - 01-10C#編程和Visual Studio使用技巧(上)
 


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
 - 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
 - 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動新
 - 01-10C#停止線程的方法
 - 01-10C#實(shí)現(xiàn)清空回收站的方法
 - 01-10C#通過重寫Panel改變邊框顏色與寬度的
 - 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
 
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 - 01-10delphi制作wav文件的方法
 - 01-10C#中split用法實(shí)例總結(jié)
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 04-02jquery與jsp,用jquery
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 


