You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:05:06