欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用Json.Net進(jìn)行序列化和反序列化及定制化

 更新時間:2019年05月26日 14:22:45   投稿:laozhang  
在本篇文章里小編給大家分享了關(guān)于C#使用Json.Net進(jìn)行序列化和反序列化及定制化的知識點總結(jié),需要的朋友們參考學(xué)習(xí)下。

序列化(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;
}

將該類的實例序列化為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)行序列化和反序列化及定制化全部知識點內(nèi)容,感謝大家對腳本之家的支持。

相關(guān)文章

  • winform用datagridview制作課程表實例

    winform用datagridview制作課程表實例

    這篇文章主要介紹了winform用datagridview制作課程表的方法,實例分析了WinForm實現(xiàn)課程表的結(jié)構(gòu)、數(shù)據(jù)庫及調(diào)用技巧,需要的朋友可以參考下
    2015-01-01
  • C#實現(xiàn)基于任務(wù)的異步編程模式

    C#實現(xiàn)基于任務(wù)的異步編程模式

    本文詳細(xì)講解了C#實現(xiàn)基于任務(wù)的異步編程模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • oledb連接access數(shù)據(jù)庫示例

    oledb連接access數(shù)據(jù)庫示例

    本文為大家介紹一個oledb連接access數(shù)據(jù)庫的示例,代碼很簡單,可以直接使用
    2014-01-01
  • C#中的匿名方法實例解析

    C#中的匿名方法實例解析

    這篇文章主要介紹了C#中的匿名方法,包括其由來、定義及用法等,需要的朋友可以參考下
    2014-09-09
  • C#多線程之線程同步

    C#多線程之線程同步

    這篇文章介紹了C#多線程之線程同步,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • c#詳解datetime使用示例

    c#詳解datetime使用示例

    本文主要介紹了c# datetime使用示例,大家參考使用吧
    2014-05-05
  • C#實現(xiàn)工廠方法模式

    C#實現(xiàn)工廠方法模式

    這篇文章介紹了C#實現(xiàn)工廠模式的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C#實現(xiàn)智能AI五子棋游戲詳解

    C#實現(xiàn)智能AI五子棋游戲詳解

    這篇文章主要為大家詳細(xì)介紹了如何通過C#實現(xiàn)智能AI五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • C#中實現(xiàn)一次執(zhí)行多條帶GO的sql語句實例

    C#中實現(xiàn)一次執(zhí)行多條帶GO的sql語句實例

    這篇文章主要介紹了C#中實現(xiàn)一次執(zhí)行多條帶GO的sql語句,以實例形式較為詳細(xì)的分析了C#執(zhí)行sql語句的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • C#實現(xiàn)變量交換、斐波那契數(shù)列、質(zhì)數(shù)、回文方法合集

    C#實現(xiàn)變量交換、斐波那契數(shù)列、質(zhì)數(shù)、回文方法合集

    這篇文章介紹了C#實現(xiàn)變量交換、斐波那契數(shù)列、質(zhì)數(shù)、回文的方法合集,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02

最新評論