C#对象转JSON在.NET中:速度与性能的秘密

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么每个C#开发者都应该掌握对象序列化为JSON

\n\n

您是否曾想过,您的代码每天有多少次将复杂的C#对象转换为紧凑的JSON字符串?与Web API交互、保存配置、微服务间数据传输——处处都离不开序列化。问题"How do I turn a C# object into a JSON string in .NET?"是Stack Overflow上最热门的问题之一,这并非偶然。您如何执行此操作,直接影响应用程序的速度和响应性。

\n\n

在本文中,我们不仅会展示如何将对象转换为JSON字符串。我们还将深入分析此过程的优化与性能:从库的选择到序列化器的精细调优。您将学会如何避免拖慢应用程序的常见错误,并编写出闪电般快速的代码。

\n\n

基础方法:如何将C#对象转换为JSON字符串

\n\n

我们从经典方法开始。假设我们有一个简单的类User:

\n\n
public class User\n{\n    public int Id { get; set; }\n    public string Name { get; set; }\n    public string Email { get; set; }\n}
\n\n

最简单的序列化方法是使用Newtonsoft.Json(也称为Json.NET):

\n\n
using Newtonsoft.Json;\n\nvar user = new User { Id = 1, Name = "阿列克谢", Email = "alex@example.com" };\nstring json = JsonConvert.SerializeObject(user);\nConsole.WriteLine(json); \n// {"Id":1,"Name":"阿列克谢","Email":"alex@example.com"}
\n\n

随着.NET Core 3.0的发布,原生System.Text.Json作为快速且轻量级的替代方案出现:

\n\n
using System.Text.Json;\n\nvar user = new User { Id = 1, Name = "阿列克谢", Email = "alex@example.com" };\nstring json = JsonSerializer.Serialize(user);\nConsole.WriteLine(json);\n// {"Id":1,"Name":"阿列克谢","Email":"alex@example.com"}
\n\n

看起来没什么区别。但当您的应用程序每秒处理数千个请求时,序列化器的选择就变得至关重要。

\n\n

性能对比:Newtonsoft.Json vs System.Text.Json

\n\n

让我们看看在.NET 8中的序列化性能。在100万次操作的测试中:

\n\n
    \n
  • System.Text.Json — 在序列化简单对象时,平均比Newtonsoft.Json快40-60%。
  • \n
  • Newtonsoft.Json — 速度上稍逊一筹,但在灵活性上胜出:支持更多自定义转换器和属性。
  • \n
  • 内存消耗 — System.Text.Json产生的垃圾更少,从而降低了垃圾回收器(GC)的负载。
  • \n
\n\n

但有一个细节:如果您需要支持JsonIgnore、JsonPropertyName或复杂转换器,Newtonsoft.Json仍然不可替代。但对于大多数基于.NET 6+的现代项目,建议使用System.Text.Json。

\n\n

序列化优化:5个实用技巧

\n\n

现在进入最有趣的部分——如何让您的代码更快。

\n\n

1. 使用源代码生成器(source generators)

\n\n

System.Text.Json支持source generation——在编译阶段而非运行时生成序列化代码。结果:速度提升2-3倍!

\n\n
[JsonSerializable(typeof(User))]\npublic partial class UserContext : JsonSerializerContext\n{\n}\n\n// 使用方式:\nstring json = JsonSerializer.Serialize(user, UserContext.Default.User);
\n\n

这种方法对于大型模型和高负载应用程序尤其有效。

\n\n

2. 根据任务定制序列化器

\n\n

不要使用默认设置。关闭不必要的选项:

\n\n
var options = new JsonSerializerOptions\n{\n    PropertyNamingPolicy = JsonNami                

博客

书籍推荐