Z
ZHANK
.NET 生态

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);