1. .NET对象转JSON的常见方式解析
在.NET开发中,对象与JSON之间的转换是日常开发中最基础也最频繁的操作之一。作为一名有多年.NET开发经验的工程师,我经常需要处理各种复杂对象的序列化需求。今天我就来详细剖析.NET中对象转JSON的几种主流方式,以及它们各自的适用场景和性能表现。
首先我们需要明确,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在Web API、微服务通信、配置文件等场景中应用广泛。在.NET生态中,主要有以下几种方式可以实现对象到JSON的转换:
1.1 原生System.Text.Json(.NET Core 3.0+)
这是微软官方推荐的现代JSON处理库,从.NET Core 3.0开始内置在框架中。它的设计目标是高性能和低内存分配,特别适合现代.NET应用程序。
csharp复制using System.Text.Json;
// 简单对象序列化
var person = new { Name = "张三", Age = 30 };
string json = JsonSerializer.Serialize(person);
// 带选项的序列化
var options = new JsonSerializerOptions {
WriteIndented = true, // 美化输出
PropertyNamingPolicy = JsonNamingPolicy.CamelCase // 驼峰命名
};
string formattedJson = JsonSerializer.Serialize(person, options);
System.Text.Json的主要特点:
- 默认情况下不缩进输出以节省空间
- 支持异步序列化/反序列化
- 可以通过JsonSerializerOptions高度定制序列化行为
- 性能优于Newtonsoft.Json(后面会详细对比)
注意:System.Text.Json在.NET 5+中功能已经相当完善,但在处理某些复杂场景(如多态类型处理)时,可能仍需要额外配置。
1.2 Newtonsoft.Json(Json.NET)
这是.NET生态中最老牌、使用最广泛的JSON库,虽然现在不再是官方默认选择,但在很多现有项目中仍然大量使用。
csharp复制using Newtonsoft.Json;
// 基本用法
var product = new Product { Id = 1, Name = "笔记本电脑" };
string json = JsonConvert.SerializeObject(product);
// 高级配置
var settings = new JsonSerializerSettings {
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore,
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
string customJson = JsonConvert.SerializeObject(product, settings);
Newtonsoft.Json的优势在于:
- 功能极其丰富,几乎可以处理任何JSON相关需求
- 高度灵活的配置系统
- 良好的向后兼容性
- 庞大的社区支持和文档资源
1.3 DataContractJsonSerializer
这是.NET Framework时代遗留的序列化器,主要特点是基于数据契约(DataContract)特性。
csharp复制using System.Runtime.Serialization.Json;
var serializer = new DataContractJsonSerializer(typeof(Person));
var stream = new MemoryStream();
// 序列化到流
var person = new Person { Name = "李四", Age = 25 };
serializer.WriteObject(stream, person);
string json = Encoding.UTF8.GetString(stream.ToArray());
// 标记数据契约的类
[DataContract]
public class Person {
[DataMember]
public string Name { get; set; }
[DataMember(IsRequired = false)]
public int Age { get; set; }
}
这种方式的局限性比较明显:
- 需要为类添加DataContract/DataMember特性
- 功能相对简单,定制选项少
- 性能不如前两种方案
- 主要用于WCF等特定场景
1.4 JavaScriptSerializer(已过时)
这是ASP.NET早期提供的JSON序列化器,现在基本已被淘汰,不推荐在新项目中使用。
csharp复制using System.Web.Script.Serialization;
var serializer = new JavaScriptSerializer();
var data = new { Key = "value", Number = 123 };
string json = serializer.Serialize(data);
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心实现原理与技术细节
2.1 System.Text.Json的底层机制
System.Text.Json采用了基于Span
- 减少内存分配:通过使用Span和MemoryPool,大幅减少了中间内存分配
- UTF-8原生处理:直接处理UTF-8编码,避免了不必要的编码转换
- 反射优化:在首次序列化时生成高效的IL代码,后续调用直接使用
csharp复制// 底层序列化过程示意(简化版)
p
