日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發布時間:2023/12/4 C# 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在C#中使用Json.Net进行序列化和反序列化及定制化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  序列化(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); //True
Console.WriteLine(JsonConvert.SerializeObject(myClass)); //{"MyBool":"TRUE"}

如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的認可是我寫作的最大動力!


原文地址:https://www.cnblogs.com/minotauros/p/10918772.html

.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?

總結

以上是生活随笔為你收集整理的在C#中使用Json.Net进行序列化和反序列化及定制化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。