【C#】序列化和反序列化,以及System.Text.Json和Newtonsoft.Json比較

給自己一個目標,然后堅持一段時間,總會有收獲和感悟!
序列化和反序列化,在實際項目開發過程中用的最多。特別是有對接接口的小伙伴就深有體會。本篇文章就簡單聊聊這個知識點。

在這里插入圖片描述

目錄

  • 一、基本概念
    • 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 屬性中。

這種弱類型轉換的方法更為靈活,并且避免了手動實現轉換器的繁瑣代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209640.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209640.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209640.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI 賦能 | 智能制造的 AI 算法開發和工程實現

談到智能制造、智慧工廠&#xff0c;愿景是美好的&#xff0c;借助計算機視覺技術和 AI 算法&#xff0c;為自動化生產線賦予環境感知的能力&#xff0c;從而改善工藝流程&#xff0c;提高生產效率。但是&#xff0c;隨著柔性化生產的需求增長&#xff0c;產線的布局調整和功能…

鎖的策略及synchronized詳解

加鎖過程中&#xff0c;處理沖突的過程中&#xff0c;涉及到的一些不同的處理方式。鎖的策略決定了線程如何獲取和釋放鎖以及在何種情況下阻塞和喚醒線程。 1. 常見的鎖策略 1.1 樂觀鎖和悲觀鎖 樂觀鎖&#xff1a;在加鎖之前&#xff0c;預估當前出現鎖沖突的概率不大&am…

Docker三 | 數據卷

目錄 Docker數據卷簡介 添加數據卷的命令 容器數據卷的繼承 Docker數據卷簡介 Docker容器產生的數據&#xff0c;如果不備份&#xff0c;當容器實例刪除后&#xff0c;容器中的數據也會消失&#xff0c;為了保存數據可以在Docker中使用數據卷。Docker數據卷是宿主機的一個可以…

vue3中子組件調用父組件的方法

<script lang"ts" setup>前提 父組件&#xff1a; 子組件&#xff1a; const emit defineEmits([closeson]) 在子組件的方法中使用&#xff1a; emit(closeson)

EP15:動態內存管理概述(c語言)malloc,calloc,realloc函數的介紹使用及柔性數組的介紹

如果學習方向是c方向那么c語言有三個板塊的知識是非常重要的. 1:指針 2:結構體 3;動態內存管理. 序言:在c語言中,什么是動態內存 C語言中的動態內存是指在程序運行時&#xff0c;根據需要動態地分配內存空間的一種內存管理方式。與靜態內存相比&#xff0c;動態內存的大小和生…

12.ROS導航模塊:gmapping、AMCL、map_server、move_base案例

目錄 1 導航概述 2 導航簡介 2.1 導航模塊簡介 1.全局地圖 2.自身定位 3.路徑規劃 4.運動控制 5.環境感知 2.2 導航坐標系odom、map 1.簡介 2.特點 3.坐標系變換 2.3 導航條件說明 1.硬件 2.軟件 3 導航實現 3.1 創建本篇博客的功能包 3.2 建圖--gmapping 3.…

JavaScript基礎知識整理(最全知識點, 精簡版,0基礎版)

文章目錄 一、輸入和輸出內容 1.1 輸出 1.1.1 在瀏覽器的控制臺輸出打印 1.1.2 直接在瀏覽器的頁面上輸出內容 1.1.3 頁面彈出警告對話框 1.2 輸入 二、變量 2.1 變量是什么 2.2 變量的聲明和賦值 2.3 變量的命名規范和規范 三、變量擴展&#xff08;數組&#xff09; 3.1 數組…

Cypress:前端自動化測試的終極利器

引言&#xff1a; 在現代軟件開發中&#xff0c;前端自動化測試已經成為了一個不可或缺的環節。它不僅可以提高開發效率&#xff0c;減少手動測試的工作量&#xff0c;還可以保證軟件的穩定性和質量。而在眾多的前端自動化測試工具中&#xff0c;Cypress無疑是其中的佼佼者。本…

openGauss學習筆記-144 openGauss 數據庫運維-例行維護-慢sql診斷

文章目錄 openGauss學習筆記-144 openGauss 數據庫運維-例行維護-慢sql診斷144.1 背景信息144.2 前提條件 openGauss學習筆記-144 openGauss 數據庫運維-例行維護-慢sql診斷 144.1 背景信息 在SQL語句執行性能不符合預期時&#xff0c;可以查看SQL語句執行信息&#xff0c;便…

文章解讀與仿真程序復現思路——中國電機工程學報EI\CSCD\北大核心《考慮垃圾處理與調峰需求的可持續化城市多能源系統規劃》

這個標題涵蓋了城市多能源系統規劃中的兩個重要方面&#xff1a;垃圾處理和調峰需求&#xff0c;并強調了規劃的可持續性。 考慮垃圾處理&#xff1a; 含義&#xff1a; 垃圾處理指的是城市廢棄物的管理和處置。這可能涉及到廢物分類、回收利用、焚燒或填埋等方法。重要性&…

GIS入門,Leaflet介紹,Leaflet可以做什么,網頁中如何使用Leaflet地圖,vue中如何使用Leaflet地圖

VueLeafLet教程推薦&#xff1a;《VueLeaflet入門》 Leaflet介紹 Leaflet是一個開源的JavaScript庫&#xff0c;用于創建交互式的地圖和地圖應用。Leaflet框架具有輕量級、靈活性強、易于使用和擴展等特點&#xff0c;支持各種地圖服務商&#xff08;如OpenStreetMap、Google…

前端知識筆記(三十八)———HTTPS:保護網絡通信安全的關鍵

當談到網絡通信和數據傳輸時&#xff0c;安全性是一個至關重要的問題。在互聯網上&#xff0c;有許多敏感信息需要通過網絡進行傳輸&#xff0c;例如個人身份信息、銀行賬戶信息和商業機密等。為了保護這些信息不被未經授權的人訪問和篡改&#xff0c;HTTPS&#xff08;超文本傳…

【開源】基于Vue+SpringBoot的河南軟件客服系統

文末獲取源碼&#xff0c;項目編號&#xff1a; S 067 。 \color{red}{文末獲取源碼&#xff0c;項目編號&#xff1a;S067。} 文末獲取源碼&#xff0c;項目編號&#xff1a;S067。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 系統管理人員2.2 業務操作人員 三、…

搞懂內存函數

引言 本文介紹memcpy的使用和模擬實現、memmove的使用和模擬實現、memcmp使用、memset使用 ? 豬巴戒&#xff1a;個人主頁? 所屬專欄&#xff1a;《C語言進階》 &#x1f388;跟著豬巴戒&#xff0c;一起學習C語言&#x1f388; 目錄 引言 memcpy memcpy的使用 memcpy的…

JS加密/解密之HOOK實戰2

上一篇文章介紹了HOOK常規的應用場景&#xff0c;這篇我們講一下HOOK其他原生函數。又是一個新的其他思路 很多時候&#xff0c;當我們想要某些網站的請求參數的時候&#xff0c;因為某些加密導致了獲取起來很復雜。 這時候hook就十分方便了 源代碼 var _JSON_Parse JSON.…

scp 指令詳細介紹

目錄 1. 基本語法 2. 例子 從本地到遠程 從遠程到本地 從遠程到遠程 使用端口和指定私鑰 遞歸復制目錄 3. 注意事項 如何拷貝文件的軟鏈接 SCP&#xff08;Secure Copy Protocol&#xff09;是一種用于在計算機之間安全地傳輸文件的協議。它通過加密的方式在網絡上安全…

Vue:Vue的開發者工具不顯示Vue實例中的data數據

一、情況描述 代碼&#xff1a; 頁面&#xff1a; 可以看到&#xff0c;input獲取到了data數據&#xff0c;但是&#xff0c;vue-devtool沒有獲取到data數據 二、解決辦法 解決辦法1&#xff1a; data.name的值不能全是中文&#xff0c;比如改成aa尚硅谷 解決辦法2&…

C語言 編程題

C語言學習&#xff01; 1.小明上課需要走n階臺階&#xff0c;他每次可以選擇走一階或者走兩階&#xff0c;他一共有多少種走法&#xff1f; 輸入描述&#xff1a;輸入包含一個整數n&#xff08;1 ≤ n ≤30&#xff09; 輸出描述&#xff1a;輸出一個整數&#xff0c;即小明可…

LeetCode 1457. 二叉樹中的偽回文路徑||位運算 DFS

1457. 二叉樹中的偽回文路徑 給你一棵二叉樹&#xff0c;每個節點的值為 1 到 9 。我們稱二叉樹中的一條路徑是 「偽回文」的&#xff0c;當它滿足&#xff1a;路徑經過的所有節點值的排列中&#xff0c;存在一個回文序列。 請你返回從根到葉子節點的所有路徑中 偽回文 路徑的…

Golang優雅實現按比例切分流量

我們在進行灰度發布時&#xff0c;往往需要轉發一部分流量到新上線的服務上&#xff0c;進行小規模的驗證&#xff0c;隨著功能的不斷完善&#xff0c;我們也會逐漸增加轉發的流量&#xff0c;這就需要按比例去切分流量&#xff0c;那么如何實現流量切分呢&#xff1f; 我們很容…