.NET 7控制台应用全局注册System.Text.Json自定义转换器方法
控制台/Windows服务中全局配置System.Text.Json的方案
这类应用没有ASP.NET Core框架级的全局配置入口,核心思路是创建一个全局复用的JsonSerializerOptions实例,统一配置转换器和序列化规则,所有序列化/反序列化操作都复用该实例即可。
1. 创建静态全局配置类
通过静态类维护全局配置实例,确保所有代码使用同一套规则:
public static class JsonGlobalConfig { // 全局共享的JsonSerializerOptions实例 public static readonly JsonSerializerOptions GlobalOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; static JsonGlobalConfig() { // 添加自定义转换器(替换成你实际的转换器集合) var customConverters = GetCustomConverters(); foreach (var converter in customConverters) { GlobalOptions.Converters.Add(converter); } // 添加内置枚举转换器 GlobalOptions.Converters.Add(new JsonStringEnumConverter()); } // 示例:获取自定义转换器的方法,根据你的实际逻辑实现 private static IEnumerable<JsonConverter> GetCustomConverters() { return new List<JsonConverter> { // new CustomDateTimeConverter(), new CustomGuidConverter() 你的自定义转换器实例 }; } }
2. 在序列化/反序列化时使用全局配置
所有System.Text.Json操作,都传入这个全局实例,替代默认无参重载:
序列化示例
var dataModel = new YourBusinessModel(); var jsonStr = JsonSerializer.Serialize(dataModel, JsonGlobalConfig.GlobalOptions);
反序列化示例
var jsonStr = "{\"name\":\"test\",\"value\":123}"; var dataModel = JsonSerializer.Deserialize<YourBusinessModel>(jsonStr, JsonGlobalConfig.GlobalOptions);
3. 结合依赖注入(复杂场景可选)
如果你的应用使用了Microsoft.Extensions.DependencyInjection(比如Windows服务常用),可以将JsonSerializerOptions注册为单例,方便在服务中注入使用:
注册单例配置
var services = new ServiceCollection(); // 初始化配置实例 var jsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; var customConverters = GetCustomConverters(); foreach (var converter in customConverters) { jsonOptions.Converters.Add(converter); } jsonOptions.Converters.Add(new JsonStringEnumConverter()); // 注册为单例 services.AddSingleton(jsonOptions); // 构建服务提供者 var serviceProvider = services.BuildServiceProvider();
在业务服务中注入使用
public class YourBackgroundWorker : BackgroundService { private readonly JsonSerializerOptions _jsonOptions; // 构造函数注入配置实例 public YourBackgroundWorker(JsonSerializerOptions jsonOptions) { _jsonOptions = jsonOptions; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // 使用注入的配置完成序列化操作 var data = new YourBusinessModel(); var json = JsonSerializer.Serialize(data, _jsonOptions); // ...后续业务逻辑 } }
关键注意事项
- 不要每次序列化都新建
JsonSerializerOptions,重复创建会重复初始化转换器等配置,影响性能,全局复用单例实例是最优方案。 - 如果需要多套配置规则(比如部分场景需要保留null值),可以在静态类中创建多个配置实例(如
JsonGlobalConfig.CamelCaseWithNulls、JsonGlobalConfig.PascalCase),按需调用。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

