C#中處理JSON資料的方式

每天进步多一点發表於2024-05-30

1.將物件序列化為JSON字串

在C#中,可以使用System.Text.JsonNewtonsoft.Json這兩個流行的庫來將物件序列化為JSON字串。以下是使用這兩個庫進行序列化的示例程式碼:

using System;
using System.Text.Json;
using Newtonsoft.Json;

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

public class Program
{
    public static void Main()
    {
        Person person = new Person { Name = "John Doe", Age = 30 };

        // 使用System.Text.Json庫進行序列化
        string json1 = JsonSerializer.Serialize(person);
        Console.WriteLine(json1);

        // 使用Newtonsoft.Json庫進行序列化
        string json2 = JsonConvert.SerializeObject(person);
        Console.WriteLine(json2);
    }
}

2.將JSON字串反序列化為物件

與將物件序列化為JSON字串相反,C#中也可以使用System.Text.JsonNewtonsoft.Json來將JSON字串反序列化為物件。以下是使用這兩個庫進行反序列化的示例程式碼:

using System;
using System.Text.Json;
using Newtonsoft.Json;

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

public class Program
{
    public static void Main()
    {
        string json = "{\"Name\":\"John Doe\",\"Age\":30}";

        // 使用System.Text.Json庫進行反序列化
        Person person1 = JsonSerializer.Deserialize<Person>(json);
        Console.WriteLine(person1.Name);
        Console.WriteLine(person1.Age);

        // 使用Newtonsoft.Json庫進行反序列化
        Person person2 = JsonConvert.DeserializeObject<Person>(json);
        Console.WriteLine(person2.Name);
        Console.WriteLine(person2.Age);
    }
}

3.對JSON進行查詢和篩選

在C#中,我們可以使用LINQ(Language-Integrated Query)來對JSON進行查詢和篩選。透過使用SelectToken方法和JsonPath表示式,我們可以方便地訪問和操作巢狀的JSON屬性。以下是一個使用LINQ查詢和篩選JSON的示例:

using System;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        string json = "{\"Name\":\"John Doe\",\"Age\":30,\"Address\":{\"City\":\"New York\",\"Country\":\"USA\"}}";
        JObject obj = JObject.Parse(json);

        // 使用JsonPath表示式查詢和篩選JSON
        JToken nameToken = obj.SelectToken("$.Name");
        Console.WriteLine(nameToken.Value<string>());

        JToken addressToken = obj.SelectToken("$.Address");
        Console.WriteLine(addressToken["City"].Value<string>());
        Console.WriteLine(addressToken["Country"].Value<string>());
    }
}

4.使用LINQ操作JSON資料

除了查詢和篩選,我們還可以使用LINQ來對JSON資料進行各種操作,例如投影、連線和排序等。以下是一個使用LINQ操作JSON資料的示例:

using System;
using System.Linq;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        string json = "[{\"Name\":\"John Doe\",\"Age\":30},{\"Name\":\"Jane Smith\",\"Age\":35}]";
        JArray array = JArray.Parse(json);

        // 使用LINQ查詢和操作JSON資料
        var names = from item in array
                    select item["Name"].Value<string>();

        foreach (string name in names)
        {
            Console.WriteLine(name);
        }
    }
}

5.處理複雜的巢狀JSON結構

在處理複雜的巢狀JSON結構時,可以使用JObjectJArray類來方便地訪問和操作JSON資料。這兩個類提供了一系列方法和屬性,用於處理巢狀的JSON物件和陣列。以下是一個處理複雜巢狀JSON結構的示例:

using System;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        string json = "{\"Name\":\"John Doe\",\"Age\":30,\"Address\":{\"City\":\"New York\",\"Country\":\"USA\"},\"Languages\":[\"C#\",\"JavaScript\"]}";
        JObject obj = JObject.Parse(json);

        Console.WriteLine(obj["Name"].Value<string>());
        Console.WriteLine(obj["Age"].Value<int>());
        Console.WriteLine(obj["Address"]["City"].Value<string>());
        Console.WriteLine(obj["Address"]["Country"].Value<string>());

        foreach (string language in obj["Languages"])
        {
            Console.WriteLine(language);
        }
    }
}

6.處理日期和時間型別的JSON資料

當JSON中包含日期和時間型別的資料時,可以使用DateTimeOffsetJsonConvert類來進行正確的處理和轉換。以下是一個處理日期和時間型別的JSON資料的示例:

using System;
using Newtonsoft.Json;

public class Person
{
    public string Name { get; set; }
    public DateTimeOffset BirthDate { get; set; }
}

public class Program
{
    public static void Main()
    {
        string json = "{\"Name\":\"John Doe\",\"BirthDate\":\"1980-01-01T00:00:00+00:00\"}";

        // 使用Newtonsoft.Json處理日期和時間型別
        Person person = JsonConvert.DeserializeObject<Person>(json);
        Console.WriteLine(person.Name);
        Console.WriteLine(person.BirthDate);
    }
}

7.處理JSON中的特殊字元和轉義序列

當處理包含特殊字元和轉義序列的JSON資料時,可以使用JsonConvert類的EscapeString方法來進行正確的轉義。以下是一個處理特殊字元和轉義序列的JSON資料的示例:

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        string text = @"This is a \"quoted\" text.";
        string json = JsonConvert.SerializeObject(text);

        Console.WriteLine(json); // 輸出:"This is a \\\\\"quoted\\\\\" text."
    }
}

8.處理大量的JSON資料

當處理包含大量JSON資料時,可以使用JsonReaderJsonWriter類來實現流式處理,從而減少記憶體佔用和提高效能。以下是一個處理大量JSON資料的示例:

using System;
using System.IO;
using Newtonsoft.Json;

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

public class Program
{
    public static void Main()
    {
        string[] names = {"John", "Jane", "Tom", "Alice"};

        using (var stream = new StreamWriter("data.json"))
        using (var writer = new JsonTextWriter(stream))
        {
            writer.WriteStartArray();

            foreach (string name in names)
            {
                var person = new Person {Name = name, Age = 30};
                JsonSerializer.Serialize(writer, person);
            }

            writer.WriteEndArray();
        }
    }
}

9.處理JSON中的異常和錯誤情況

在處理JSON資料時,可能會遇到各種異常和錯誤情況。為了確保程式碼的健壯性和可靠性,應該使用try-catch語句來捕獲和處理異常。以下是一個處理JSON異常和錯誤情況的示例:

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        try
        {
            string invalidJson = "This is not a valid JSON.";
            dynamic obj = JsonConvert.DeserializeObject(invalidJson);
        }
        catch (JsonReaderException ex)
        {
            Console.WriteLine("JSON解析錯誤:" + ex.Message);
        }
        catch (JsonSerializationException ex)
        {
            Console.WriteLine("JSON序列化錯誤:" + ex.Message);
        }
    }
}

10.最佳實踐和效能最佳化建議

在處理JSON資料時,遵循以下最佳實踐和效能最佳化建議可以提高程式碼的可讀性和效能:

  • 儘可能使用System.Text.Json庫,它是.NET Core的預設JSON庫,效能比Newtonsoft.Json更好。
  • 對於複雜的巢狀JSON結構,使用JObject和JArray類進行訪問和操作。
  • 對於大量的JSON資料,使用JsonReader和JsonWriter類進行流式處理。
  • 使用LINQ查詢和操作JSON資料,使程式碼更簡潔和可讀。
  • 避免在迴圈內進行重複的JSON序列化和反序列化操作,儘量快取結果。

相關文章