在現(xiàn)代軟件開發(fā)中,JSON(JavaScript Object Notation)作為一種輕量級(jí)的數(shù)據(jù)交換格式,被廣泛應(yīng)用于前后端交互、配置文件管理以及分布式系統(tǒng)間的數(shù)據(jù)傳輸。System.Text.Json
是 .NET Core 3.0 及更高版本中引入的高性能 JSON 處理庫,提供了序列化和反序列化的功能,并且與 .NET 平臺(tái)深度集成, 在 ASP.NET Core Web API 中是默認(rèn)的 JSON 序列化和反序列化庫 ,用于處理 HTTP 請(qǐng)求和響應(yīng)中的 JSON 數(shù)據(jù)。
1. 配置 System.Text.Json
在 ASP.NET Core 項(xiàng)目中,可以通過 Startup.cs
或 Program.cs
配置 System.Text.Json
的行為。以下是一些常見的配置選項(xiàng):
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(options =>
{
// 配置 JSON 序列化選項(xiàng)
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 使用駝峰式命名
options.JsonSerializerOptions.WriteIndented = true; // 格式化輸出
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); // 取消 Unicode 編碼
options.JsonSerializerOptions.IgnoreNullValues = true; // 忽略空值
options.JsonSerializerOptions.AllowTrailingCommas = true; // 允許尾隨逗號(hào)
options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 反序列化時(shí)不區(qū)分大小寫
});
}
2. 序列化和反序列化
序列化
在控制器中返回對(duì)象時(shí),System.Text.Json
會(huì)自動(dòng)將其序列化為 JSON:
[HttpGet]
public IActionResult Get()
{
var user = new { Name = "張三", Age = 30 };
return Ok(user); // 自動(dòng)序列化為 JSON
}
需要手動(dòng)序列化,可以使用 JsonSerializer.Serialize
:
var user = new { Name = "張三", Age = 30 };
string jsonString = JsonSerializer.Serialize(user);
return Ok(jsonString);
反序列化
在接收 JSON 數(shù)據(jù)時(shí),System.Text.Json
會(huì)自動(dòng)將其反序列化為對(duì)象。例如,通過 [FromBody]
接收請(qǐng)求體中的 JSON 數(shù)據(jù):
[HttpPost]
public IActionResult Post([FromBody] User user)
{
return Ok(user);
}
需要手動(dòng)反序列化,可以使用 JsonSerializer.Deserialize
:
string jsonString = await new StreamReader(Request.Body).ReadToEndAsync();
var user = JsonSerializer.Deserialize<User>(jsonString);
return Ok(user);
3. 高級(jí)用法
自定義轉(zhuǎn)換器
需要對(duì)特定類型進(jìn)行自定義序列化或反序列化,可以實(shí)現(xiàn) JsonConverter<T>
并注冊(cè)到 JsonSerializerOptions
中:
public classCustomDateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
}
}
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new CustomDateTimeConverter());
});
使用 JsonDocument
和 JsonNode
在某些場(chǎng)景下,可能需要?jiǎng)討B(tài)處理 JSON 數(shù)據(jù),而不是直接映射到實(shí)體類。可以使用 JsonDocument
或 JsonNode
:
string jsonString = await new StreamReader(Request.Body).ReadToEndAsync();
using JsonDocument doc = JsonDocument.Parse(jsonString);
var name = doc.RootElement.GetProperty("Name").GetString();
return Ok(name);
或者使用 JsonNode
:
JsonNode node = JsonNode.Parse(jsonString);
var name = node["Name"].GetValue<string>();
return Ok(name);
4. 全局配置
在 Web API 中,可以通過 JsonSerializerOptions
配置全局的 JSON 處理行為。例如,設(shè)置日期格式:
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
其中,DateTimeConverter
是自定義的日期格式轉(zhuǎn)換器。
5. 性能優(yōu)化
從 .NET 8 開始,System.Text.Json
支持源生成(Source Generation),可以在編譯時(shí)生成優(yōu)化的序列化和反序列化代碼:
[JsonSerializable(typeof(User))]
[JsonSourceGenerationOptions(WriteIndented = true, PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase)]
public partial class JsonContext : JsonSerializerContext
{
}
dotnet 10 中新增的 JsonIgnoreCondition,可以比較方便地只處理屬性的序列化和反序列化時(shí)忽略。不過Net10是預(yù)覽版版本的,很期待上線,所以暫時(shí)不介紹。
6.特性
請(qǐng)參考:https://mp.weixin.qq.com/s/N1ldYFwjZfscJ4_UW7XBqg
總結(jié)
System.Text.Json
是 ASP.NET Core Web API 中默認(rèn)的 JSON 處理庫,提供了豐富的配置選項(xiàng)和高性能的序列化與反序列化功能。通過合理配置和使用高級(jí)特性,可以滿足各種復(fù)雜的業(yè)務(wù)需求。
閱讀原文:原文鏈接
該文章在 2025/3/24 13:22:32 編輯過