C# System.Text.Json实现高效JSON序列化与反序列化
引言
在.NET生态中,JSON作为主流数据交换格式,其处理效率直接影响应用性能。自.NET Core 3.0引入System.Text.Json
以来,开发者拥有了一个高性能、低内存分配的官方JSON解决方案。本文将深入解析其核心功能,助您掌握JSON处理的最佳实践。
一、基础用法快速入门
1.1 简单序列化示例
using System.Text.Json;var person = new Person { Name = "Alice", Age = 30 };
string json = JsonSerializer.Serialize(person);
// 输出:{"Name":"Alice","Age":30}
1.2 反序列化操作
string json = @"{""Name"":""Bob"",""Age"":25}";
Person person = JsonSerializer.Deserialize<Person>(json);
二、高级配置技巧
2.1 自定义序列化选项
var options = new JsonSerializerOptions {PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 驼峰命名WriteIndented = true, // 美化输出IgnoreNullValues = true, // 忽略空值NumberHandling = JsonNumberHandling.WriteAsString // 数字序列化为字符串
};
2.2 处理特殊数据类型
日期格式化:
options.Converters.Add(new JsonStringEnumConverter()); // 枚举转字符串
options.DateHandling = JsonDateHandling.ISO8601; // ISO 8601日期格式
三、性能优化策略
3.1 使用源码生成器(.NET 6+)
[JsonSerializable(typeof(Person))]
public partial class AppJsonContext : JsonSerializerContext {}// 高性能序列化
JsonSerializer.Serialize(person, AppJsonContext.Default.Person);
3.2 内存优化技巧
-
复用
JsonSerializerOptions
实例 -
使用
Utf8JsonWriter
直接写入流
using var stream = new MemoryStream();
using var writer = new Utf8JsonWriter(stream);
JsonSerializer.Serialize(writer, person);
四、与Newtonsoft.Json对比
特性 | System.Text.Json | Newtonsoft.Json |
---|---|---|
性能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
内存分配 | 低 | 较高 |
功能丰富度 | 基础功能 | 高度扩展 |
依赖项 | .NET内置 | 需安装NuGet包 |
迁移建议:对性能敏感场景优先使用System.Text.Json,复杂需求可结合两者使用
五、常见问题解决方案
5.1 循环引用处理
options.ReferenceHandler = ReferenceHandler.Preserve;
5.2 字段序列化
options.IncludeFields = true; // 包含公共字段
5.3 忽略属性
public class Person
{[JsonIgnore] // 忽略单个属性public int SecretCode { get; set; }
}
六、最佳实践总结
-
生产环境务必配置自定义JsonSerializerOptions
-
优先使用异步方法处理大文件
-
利用
JsonDocument
解析未知结构JSON -
定期检查版本更新获取性能优化
结语
通过掌握System.Text.Json的核心用法与优化技巧,开发者可以在.NET应用中实现高效的JSON数据处理。随着.NET版本的迭代,该库将持续增强功能,建议关注官方更新日志获取最新特性。
扩展阅读:微软官方文档