JSON 序列化
System.Text.Json 序列化/反序列化、JsonSerializerOptions、命名策略
JSON 序列化
.NET 内置了 System.Text.Json——高性能、低分配的 JSON 处理,大部分场景替代 Newtonsoft.Json。
学完本章你将: 掌握 JsonSerializer 序列化/反序列化、选项配置、命名策略。
基本序列化
csharp
using System.Text.Json;
var person = new { Name = "小明", Age = 25 };
// 序列化
string json = JsonSerializer.Serialize(person);
// {"Name":"小明","Age":25}
// 格式化输出
string pretty = JsonSerializer.Serialize(person, new JsonSerializerOptions
{
WriteIndented = true
});
// 反序列化
var obj = JsonSerializer.Deserialize<Person>(json);
JsonSerializerOptions 常用配置
csharp
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 驼峰命名
PropertyNameCaseInsensitive = true, // 忽略大小写
WriteIndented = true, // 格式化
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, // 忽略 null
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, // 中文不转义
};
string json = JsonSerializer.Serialize(data, options);
特性注解
csharp
public class Person
{
public string Name { get; set; }
[JsonPropertyName("user_age")] // 自定义 JSON 字段名
public int Age { get; set; }
[JsonIgnore] // 序列化时忽略
public string Password { get; set; }
[JsonExtensionData] // 捕获未知字段
public Dictionary<string, JsonElement>? Extras { get; set; }
}
源生成器(.NET 6+ 高性能)
csharp
[JsonSerializable(typeof(Person))]
internal partial class MyJsonContext : JsonSerializerContext { }
// 使用源生成器(零反射,AOT 兼容)
string json = JsonSerializer.Serialize(person, MyJsonContext.Default.Person);