引言:为什么每个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:
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\nusing 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\nusing 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
但有一个细节:如果您需要支持JsonIgnore、JsonPropertyName或复杂转换器,Newtonsoft.Json仍然不可替代。但对于大多数基于.NET 6+的现代项目,建议使用System.Text.Json。
序列化优化:5个实用技巧
\n\n现在进入最有趣的部分——如何让您的代码更快。
\n\n1. 使用源代码生成器(source generators)
\n\nSystem.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\n2. 根据任务定制序列化器
\n\n不要使用默认设置。关闭不必要的选项:
\n\nvar options = new JsonSerializerOptions\n{\n PropertyNamingPolicy = JsonNami