1. .NET对象转JSON的常见方式解析
在.NET开发中,对象与JSON之间的转换是日常开发中最基础也最频繁的操作之一。作为一名有多年.NET开发经验的工程师,我经常需要处理各种序列化场景,也踩过不少坑。今天就来系统梳理一下.NET中对象转JSON的几种主流方式,分析它们的优缺点和适用场景。
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,已经成为现代Web开发的事实标准。在.NET生态中,我们有多种方式可以实现对象到JSON的转换,每种方式都有其特点和适用场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 内置方案:System.Text.Json
2.1 基本使用方法
System.Text.Json是.NET Core 3.0开始引入的高性能JSON序列化库,也是目前微软官方推荐的首选方案。它的基本使用非常简单:
csharp复制using System.Text.Json;
var person = new Person { Name = "张三", Age = 30 };
string json = JsonSerializer.Serialize(person);
反序列化也同样简单:
csharp复制var person = JsonSerializer.Deserialize<Person>(json);
2.2 性能优势
System.Text.Json最大的优势在于性能。根据微软的基准测试,它比Newtonsoft.Json快约1.5-2倍,内存分配也更少。这主要得益于:
- 它使用了Span
和Memory 等现代.NET特性 - 采用了基于Utf8的底层处理
- 避免了不必要的内存分配
对于高性能要求的场景,如高并发API服务,System.Text.Json是更好的选择。
2.3 配置选项
System.Text.Json提供了丰富的配置选项:
csharp复制var options = new JsonSerializerOptions
{
WriteIndented = true, // 美化输出
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 属性名驼峰式
IgnoreNullValues = true, // 忽略null值
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping // 宽松的字符转义
};
string json = JsonSerializer.Serialize(person, options);
2.4 自定义序列化
对于特殊需求,可以通过实现JsonConverter
csharp复制public class DateTimeConverter : 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"));
}
}
// 使用自定义转换器
var options = new JsonSerializerOptions
{
Converters = { new DateTimeConverter() }
};
注意:System.Text.Json在.NET Core 3.x中功能相对基础,.NET 5+版本增加了更多特性,如支持字段序列化、更灵活的类型处理等。
3. 经典方案:Newtonsoft.Json
3.1 基本使用
Newtonsoft.Json(又称Json.NET)是.NET生态中最流行的JSON库,虽然现在不再是官方默认,但依然被广泛使用。
csharp复制using New
