給自己一個目標,然后堅持一段時間,總會有收獲和感悟!
序列化和反序列化,在實際項目開發過程中用的最多。特別是有對接接口的小伙伴就深有體會。本篇文章就簡單聊聊這個知識點。
目錄
- 一、基本概念
- 1.1、序列化
- 1.2反序列化
- 1.3、舉例
- 二、特點優勢
- 2.1、System.Text.Json
- 2.2、Newtonsoft.Json
- 2.3、共同點
- 三、自定義
- 3.1、轉換器
- 3.2、JsonElement
一、基本概念
1.1、序列化
在編程中,序列化是指將對象轉換為可存儲或傳輸的格式,例如將對象轉換為 JSON 字符串或字節流。
1.2反序列化
在編程中,反序列化則是將存儲或傳輸的數據轉換回對象的過程。
1.3、舉例
序列化和反序列化經常用于數據的持久化、數據交換以及與外部系統的通信。
它們可以使對象在不同的環境中進行傳輸和重用。
在 C# 中,你可以使用不同的庫來實現序列化和反序列化
1)System.Text.Json
這是 .NET Core 3.0 引入的官方 JSON 庫。它提供了簡單而高效的 API,使得將對象序列化為 JSON 字符串或將 JSON 字符串反序列化為對象非常容易。
using System.Text.Json;// 將對象序列化為 JSON 字符串
string jsonString = JsonSerializer.Serialize(obj);// 將 JSON 字符串反序列化為對象
var obj = JsonSerializer.Deserialize<ClassName>(jsonString);
2)Newtonsoft.Json
也稱為 Json.NET,是一個流行且功能強大的第三方 JSON 庫。它提供了更高級的功能,如自定義轉換器、null 值處理、循環引用等等。
using Newtonsoft.Json;// 將對象序列化為 JSON 字符串
string jsonString = JsonConvert.SerializeObject(obj);// 將 JSON 字符串反序列化為對象
var obj = JsonConvert.DeserializeObject<ClassName>(jsonString);
這里的 obj 是要進行序列化或反序列化的對象,ClassName 是對象的類名。
無論使用哪個庫,都可以根據具體的需求選擇適合的庫來進行序列化和反序列化操作。它們都提供了方便的 API,使得處理 JSON 數據變得簡單快捷。
二、特點優勢
2.1、System.Text.Json
System.Text.Json 相比于 Newtonsoft.Json,具有以下優勢和特點
1)性能
System.Text.Json 在性能方面進行了優化,通常比 Newtonsoft.Json 更快。它利用了新的讀寫 API,采用更高效的內部實現,以提供更好的性能和內存利用率。
2)屬于 .NET Core
System.Text.Json 是 .NET Core 的一部分,因此在創建跨平臺應用程序時,不需要額外的依賴項。這使得在 .NET Core 平臺上使用它更加方便。
3)簡單場景
System.Text.Json 提供了一些簡化的 API,使得在處理簡單的 JSON 數據時更容易操作。
例如,可以直接通過
JsonSerializer.Deserialize() 方法進行快速的反序列化,而無需像在 Newtonsoft.Json 中那樣使用 JsonConvert.DeserializeObject()。
4)默認是強類型轉換,比如:實體類定義的是字符串,json字符串返回的是整型,轉換時會報錯
2.2、Newtonsoft.Json
Newtonsoft.Json 相比于 System.Text.Json,具有以下優勢和特點
1)使用廣泛
多年來已經存在并廣泛使用,Newtonsoft.Json 是一個成熟的第三方庫,在 .NET 社區中被廣泛接受和使用。它擁有豐富的功能和強大的靈活性,已經在許多項目中得到驗證。
2)功能豐富
更豐富的功能,Newtonsoft.Json 提供了一些更高級的功能,如完全自定義的序列化和反序列化邏輯,包括對循環引用的處理、自定義轉換器、忽略屬性等等。它可以方便地處理一些復雜的 JSON 數據場景。
3)支持若類型轉換的特點
2.3、共同點
雖然 System.Text.Json 和 Newtonsoft.Json 之間有一些區別,但它們也有一些共同點
1)序列化和反序列化
兩個庫都提供了用于將對象序列化為 JSON 字符串或將 JSON 字符串反序列化為對象的功能。
2)支持類型轉換
無論是 System.Text.Json 還是 Newtonsoft.Json 都提供了靈活的類型轉換機制,可以處理不同的數據類型之間的轉換。
3)可定制性
兩個庫都允許你通過自定義轉換器、自定義屬性特性等方式來定制序列化和反序列化的行為。
三、自定義
3.1、轉換器
在 .NET Core 6.0 中,默認情況下,System.Text.Json 是進行強類型轉換的。
然而,你可以通過自定義轉換器來實現弱類型轉換,以將 JSON 字段的整型值轉換為實體類的字符串屬性。
首先,你需要定義一個自定義的轉換器,實現將整型值轉換為字符串的邏輯。
using System;
using System.Text.Json;
using System.Text.Json.Serialization;public class IntToStringConverter : JsonConverter<string>
{public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){if (reader.TokenType == JsonTokenType.Number){return reader.GetInt32().ToString();}return reader.GetString();}public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options){writer.WriteStringValue(value);}
}
然后,在你的實體類的屬性上使用 [JsonConverter] 特性,將自定義轉換器應用于屬性。
public class MyEntity
{[JsonConverter(typeof(IntToStringConverter))]public string MyProperty { get; set; }
}
現在,當使用 System.Text.Json 進行反序列化時,整型字段將被自動轉換為字符串類型。
string json = "{\"MyProperty\": 123}";
MyEntity entity = JsonSerializer.Deserialize<MyEntity>(json);
Console.WriteLine(entity.MyProperty); // 輸出 "123"
溫馨提示,這只會影響轉換過程,而不會改變實體類的定義和屬性類型。
3.2、JsonElement
System.Text.Json 還提供了另一個選項來實現弱類型轉換,即使用 JsonElement
類型。
通過將 JSON 字符串解析為 JsonElement
,你可以直接從中獲取任何類型的值,而無需指定具體的類型。
例如,如果你的 JSON 對象中有一個名為 "age"
的整型屬性,你可以將其轉換為字符串類型,
- 如下所示
using System.Text.Json;
using System.Text.Json.Serialization;public class MyEntity
{[JsonIgnore]public int Age { get; set; }[JsonPropertyName("age")]public JsonElement AgeElement { get; set; }[JsonIgnore]public string AgeAsString => AgeElement.GetString();
}
在上面的示例中,
Age
屬性被標記為[JsonIgnore]
,這意味著它不會被反序列化過程使用。
相反,使用[JsonPropertyName]
特性來指定 JSON 中的屬性名,并將其映射到AgeElement
屬性上。
最后,你可以通過調用GetString()
方法從JsonElement
中獲取字符串類型的值,將其存儲在AgeAsString
屬性中。
這種弱類型轉換的方法更為靈活,并且避免了手動實現轉換器的繁瑣代碼。