JSON序列化和反序列化最好的C#庫——Newtonsoft.Json

一、什麼是JSON?

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,可以將數據進行簡單地描述和傳輸。它以鍵值對的方式組織數據,常用於前後端數據傳輸、數據存儲和配置文件等場合。JSON的語法和JavaScript中的對象字面量非常類似,但是它是一種獨立於編程語言的格式。C#提供了豐富的JSON序列化和反序列化庫,其中最著名的是Newtonsoft.Json。

二、Newtonsoft.Json的優點

Newtonsoft.Json是一個功能強大的JSON序列化和反序列化庫,它支持.NET Framework、.NET Core和Mono等多個平台,擁有廣泛的應用。相較於C#自帶的System.Text.Json庫,它具有更好的兼容性和靈活性,可以滿足各種複雜的JSON數據需求。

Newtonsoft.Json的主要優點包括:

1. 處理複雜數據結構更方便。

與System.Text.Json相比,Newtonsoft.Json更容易處理嵌套複雜的JSON數據結構,例如嵌套數組、嵌套對象等,而且提供了更多的自定義選項,便於根據需求調整序列化和反序列化的行為。

2. 支持自定義序列化規則。

Newtonsoft.Json提供了豐富的自定義序列化和反序列化選項,可以通過自定義JsonConverter來支持不規則的數據結構,如xml、csv等格式的數據。

3. 具有良好的性能和兼容性。

Newtonsoft.Json擁有良好的性能和兼容性,可以處理大量的JSON數據,且在各種平台和框架中都能夠正常運行。它在github上的關注度和貢獻者數量也很高,社區支持比較完善。

三、Newtonsoft.Json的基本用法

下面演示Newtonsoft.Json的基本用法,包括:對象序列化、對象反序列化、匿名類型序列化、匿名類型反序列化和JSON字元串轉換。我們可以通過Nuget安裝Newtonsoft.Json包,然後引入Newtonsoft.Json命名空間。

1. 對象序列化

對象序列化指將C#對象轉換為JSON字元串,常用於網路傳輸或文件保存等。Newtonsoft.Json提供了JsonConvert.SerializeObject()方法來進行對象序列化,可以將對象轉換為JSON字元串。

using Newtonsoft.Json;

public class Person {
    public string Name;
    public int Age;
}

Person person = new Person { Name = "張三", Age = 20 };
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json); // 輸出:{"Name":"張三","Age":20}

2. 對象反序列化

對象反序列化指將JSON字元串轉換為C#對象,常用於接收網路請求或讀取文件等。Newtonsoft.Json提供了JsonConvert.DeserializeObject()方法來進行對象反序列化,可以將JSON字元串轉換為對象。

string json = '{"Name":"張三","Age":20}';
Person person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person.Name); // 輸出:張三
Console.WriteLine(person.Age); // 輸出:20

3. 匿名類型序列化

匿名類型指在聲明時不指定類型名稱的對象,常用於簡單的數據快速傳遞。Newtonsoft.Json可以直接對匿名類型進行序列化,不需要聲明額外的類型。

var person = new { Name = "張三", Age = 20 };
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json); // 輸出:{"Name":"張三","Age":20}

4. 匿名類型反序列化

同樣地,Newtonsoft.Json也可以對匿名類型進行反序列化。

string json = '{"Name":"張三","Age":20}';
var person = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(person.Name); // 輸出:張三
Console.WriteLine(person.Age); // 輸出:20

5. JSON字元串轉換

Newtonsoft.Json提供了JObject和JArray兩種類型來方便地處理JSON字元串。

string json = '{"Name":"張三","Age":20}';
JObject obj = JObject.Parse(json);
string name = obj["Name"].ToString();
int age = (int)obj["Age"];
Console.WriteLine(name); // 輸出:張三
Console.WriteLine(age); // 輸出:20

四、Newtonsoft.Json高級用法

1. 序列化屬性過濾

有時候,需要有選擇地對對象進行序列化,只序列化其中的一些屬性,跳過其他屬性。可以使用JsonPropertyAttribute和JsonIgnoreAttribute屬性來指定屬性的序列化和忽略選項。

public class Person {
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonIgnore]
    public int Age { get; set; }
}

Person person = new Person { Name = "張三", Age = 20 };
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json); // 輸出:{"name":"張三"}

2. 自定義序列化方式

如果需要對特定類型進行自定義的序列化和反序列化操作,可以繼承JsonConverter,並重寫它的ReadJson和WriteJson方法。下面是一個將枚舉值序列化成小寫字元串的例子。

class LowercaseEnumConverter : JsonConverter {
    public override bool CanConvert(Type objectType) {
        return objectType.IsEnum;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        writer.WriteValue(value.ToString().ToLowerInvariant());
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        return Enum.Parse(objectType, (string)reader.Value, true);
    }
}

enum Gender { Male, Female };

public class Person {
    public string Name;
    [JsonConverter(typeof(LowercaseEnumConverter))]
    public Gender Gender;
}

Person person = new Person { Name = "張三", Gender = Gender.Male };
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json); // 輸出:{"Name":"張三","Gender":"male"}

Person person2 = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person2.Gender); // 輸出:Gender.Male

3. 非標準JSON序列化

有些特殊的JSON格式不符合標準的JSON規範。例如,如果在屬性名中包含了非字母和數字字元,或者在數組中包含了不同類型的元素,標準的JSON庫會報錯。Newtonsoft.Json提供了一些選項,可以用於處理這些非標準的JSON格式。

string json = '{"field-a": 1, "field-b": "value-b", "field-c": true}';
JObject obj = JObject.Parse(json);
int fieldA = (int)obj["field-a"];
string fieldB = (string)obj["field-b"];
bool fieldC = (bool)obj["field-c"];
Console.WriteLine(fieldA); // 輸出:1
Console.WriteLine(fieldB); // 輸出:value-b
Console.WriteLine(fieldC); // 輸出:True

string json2 = '[1, "value-b", True]';
JArray arr = JArray.Parse(json2);
int elem1 = (int)arr[0];
string elem2 = (string)arr[1];
bool elem3 = (bool)arr[2];
Console.WriteLine(elem1); // 輸出:1
Console.WriteLine(elem2); // 輸出:value-b
Console.WriteLine(elem3); // 輸出:True

小結

Newtonsoft.Json是C#中最好的JSON序列化和反序列化庫之一,具有靈活性、兼容性和性能優勢。通過本文的介紹,我們了解了Newtonsoft.Json的基本用法和高級用法,可以滿足各種複雜的JSON數據需求。在進行C#開發時,選擇Newtonsoft.Json可以方便地處理JSON數據,提高效率。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301614.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-30 16:09
下一篇 2024-12-30 16:09

相關推薦

  • 金額選擇性序列化

    本文將從多個方面對金額選擇性序列化進行詳細闡述,包括其定義、使用場景、實現方法等。 一、定義 金額選擇性序列化指根據傳入的金額值,選擇是否進行序列化,以達到減少數據傳輸的目的。在實…

    編程 2025-04-29
  • JSON的MD5

    在Web開發過程中,JSON(JavaScript Object Notation)是最常用的數據格式之一。MD5(Message-Digest Algorithm 5)是一種常用…

    編程 2025-04-29
  • 使用Java將JSON寫入HDFS

    本篇文章將從以下幾個方面詳細闡述Java將JSON寫入HDFS的方法: 一、HDFS簡介 首先,先來了解一下Hadoop分散式文件系統(HDFS)。HDFS是一個可擴展性高的分散式…

    編程 2025-04-29
  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文將從多個方面深入探討Java反序列化漏洞,對於筆者所總結的經驗和教訓,以及掌握Java反序列化的設計模式、最佳實踐和防範措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    編程 2025-04-28
  • 如何使用Newtonsoft datatable轉Json

    Newtonsoft DataTable 是一個基於.NET的JSON框架,也是一個用於序列化和反序列化JSON的強大工具。 在本文中,我們將學習如何使用Newtonsoft Da…

    編程 2025-04-28
  • JPRC – 輕鬆創建可讀性強的 JSON API

    本文將介紹一個全新的 JSON API 框架 JPRC,通過該框架,您可以輕鬆創建可讀性強的 JSON API,提高您的項目開發效率和代碼可維護性。接下來將從以下幾個方面對 JPR…

    編程 2025-04-27
  • 使用Python獲取JSON並解析

    本文將介紹如何使用Python獲取JSON數據並解析相關內容。通過使用Python的第三方庫,我們可以輕鬆地處理JSON數據,包括讀取、提取和操作JSON數據。 一、獲取JSON數…

    編程 2025-04-27
  • Python存為JSON的方法及實例

    本文將從以下多個方面對Python存為JSON做詳細的闡述。 一、JSON簡介 JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,易於人閱…

    編程 2025-04-27
  • 使用Spread 8展示JSON數據

    使用Spread 8可以方便地展示JSON數據,本文將詳細介紹如何利用Spread 8展示JSON數據。 一、Spread 8簡介 Spread 8是一款強大的電子表格軟體,可以方…

    編程 2025-04-27
  • 如何在json轉實體類時忽略大小寫

    本文將從以下幾個方面介紹如何在json轉實體類時忽略大小寫。 一、使用Gson庫實現json轉實體類忽略大小寫 Gson是Google提供的Java JSON操作庫,它提供了簡單易…

    編程 2025-04-27

發表回復

登錄後才能評論