前言
JSON(JavaScript Object Notation)是一種基于文本,獨立于語言的輕量級數(shù)據(jù)交換格式,它易于閱讀和編寫,并且易于機器解析和生成?,F(xiàn)已成為各種應用程序之間數(shù)據(jù)交換和通信的主流數(shù)據(jù)格式。在 .NET 通過三方庫如 Newtonsoft.Json 或者 System.Text.Json 實現(xiàn)JSON的序列化與反序列化,本文一起了解 System.Text.Json 序列化與反序列化基礎用法。
System.Text.Json
1、概述
System.Text.Json 是 C# 中的一個 JSON 序列化和反序列化庫,從 .NET Core 3.0及更高版本中,通過內置方式提供支持。如果在.NET Framework 4.7及更高版本中,使用可通過NuGet包管理器安裝 System.Text.Json。
2、常用的類
JsonSeriliazer:提供將對象或值類型序列化為 JSON 以及將 JSON 反序列化為對象或值類型的功能;
JsonDocument: 提供用于檢查 JSON 值的結構內容,而不自動實例化數(shù)據(jù)值的機制;
JsonSerializerOptions: 提供與 JsonSerializer 一起使用的選項;
3、序列化
JSON 序列化是將對象或值類型轉化為JSON格式的文本內容的過程。下面是一個簡單的示例:
using System;
using System.Text.Encodings.Web;
using System.Text.Json;
namespace Fountain.WinConsole.JSONDemo
{
internal class Program
{
static void Main(string[] args)
{
// 定義一個對象
Address address = new Address
{
Province = "廣東省",
City = "深圳市",
District="羅湖區(qū)",
Town= "蓮塘街道",
Detail= "梧桐山公園"
};
// 配置 JsonSerializer 使用的選項 此處配置支持中文不轉義
var options = new JsonSerializerOptions
{
// 允許字符通過而不進行轉義方面更加寬松
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
}
// 將對象序列化為JSON
string json= JsonSerializer.Serialize(address, options);
// 輸出 JSON
Console.WriteLine(json);
//
Console.ReadKey();
}
}
}
4、反序列化
JSON 反序列化是將 JSON 格式的文本內容轉換回 .NET 對象或值類型的過程。下面是一個簡單的示例:
using System;
using System.Text.Encodings.Web;
using System.Text.Json;
namespace Fountain.WinConsole.JSONDemo
{
internal class Program
{
static void Main(string[] args)
{
// 配置 JsonSerializer 使用的選項 此處配置支持中文不轉義
var options = new System.Text.Json.JsonSerializerOptions
{
// 允許字符通過而不進行轉義方面更加寬松
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
// JSON 格式文本內容
string jsonString = "{\"City\":\"深圳市\(zhòng)",\"Detail\":\"梧桐山公園\",\"District\":\"羅湖區(qū)\",\"Province\":\"廣東省\",\"Town\":\"蓮塘街道\"}";
// 將 JSON 反序列化為對象
var addr = JsonSerializer.Deserialize<Address>(jsonString);
Console.WriteLine(addr.Province);
// 或
var Address = JsonSerializer.Deserialize<Address>(jsonString, options);
Console.ReadKey();
}
}
}
5、配置選項
通過使JsonSerializerOptions類配置選項,告訴JsonSerializer如何序列化和反序列化JSON。下面示例是一些選項使用:
var options = new JsonSerializerOptions
{
// 整齊打印
WriteIndented = true,
// 關閉轉義,默認情況下,序列化程序會轉義所有非 ASCII 字符。即,會將中文替換為 \uxxxx,其中 xxxx 為字符的 Unicode 代碼。
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
// 反序列化不區(qū)分大小寫
PropertyNameCaseInsensitive = true,
// 駝峰命名
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
// 對字典的鍵進行駝峰命名
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
// 序列化的時候忽略null值屬性
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
// 忽略只讀屬性,因為只讀屬性只能序列化而不能反序列化,所以在以json為儲存數(shù)據(jù)的介質的時候,序列化只讀屬性意義不大
IgnoreReadOnlyFields = true,
// 不允許結尾有逗號的不標準json
AllowTrailingCommas = false,
// 不允許有注釋的不標準json
ReadCommentHandling = JsonCommentHandling.Disallow,
// 允許在反序列化的時候原本應為數(shù)字的字符串(帶引號的數(shù)字)轉為數(shù)字
NumberHandling = JsonNumberHandling.AllowReadingFromString,
// 處理循環(huán)引用類型
ReferenceHandler = ReferenceHandler.IgnoreCycles,
// 類型轉換
Converters =
{
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
}
};
6、自定義轉換器
System.Text.Json 提供了JSON序列化類創(chuàng)建自定義轉換器,轉換器是一種將對象或值與 JSON 相互轉換的類。我們可以編寫自定義轉換器來替代內置轉換器的默認行為。(本文不展開詳細的描述)
7、解析 JSON
使用 JsonDocument 類可對JSON文本內容進行解析。下面是一個簡單的示例:
using System;
using System.Text.Encodings.Web;
using System.Text.Json;
namespace Fountain.WinConsole.JSONDemo
{
internal class Program
{
static void Main(string[] args)
{
// JSON 文本內容
string jsonString = "{\"City\":\"深圳市\(zhòng)",\"Detail\":\"梧桐山公園\",\"District\":\"羅湖區(qū)\",\"Province\":\"廣東省\",\"Town\":\"蓮塘街道\"}";
// 創(chuàng)建 JsonDocument 對象
using (JsonDocument jsondocument = JsonDocument.Parse(jsonString))
{
var rootElement = jsondocument.RootElement;
//
var city = rootElement.GetProperty("City").GetString();
Console.WriteLine(city);
//
var Detail = rootElement.GetProperty("Detail").GetString();
Console.WriteLine(Detail);
}
Console.ReadKey();
}
}
}
小結
以上是C#使用System.Text.Json序列化與反序列化基礎用法,其使用還是比較容易的。希望本文對您有所收獲,如有不到之處,請多多包涵。
該文章在 2024/11/7 10:31:27 編輯過