如何在JsonSerializerContext中使用带蛇形小写的JsonStringEnumConverter
问题描述
现有代码执行后输出的JSON如下:
{ "ticket_state": 0 }
希望添加使用JsonNamingPolicy.SnakeCaseLower命名策略的JsonStringEnumConverter,使输出变为:
{ "ticket_state": "in_progress" }
相关原始代码如下:
Ticket ticket = new Ticket() { State = TicketState.InProgress }; string serialized = JsonSerializer.Serialize(ticket, JsonContext.Default.Ticket); Console.WriteLine(serialized); public class Ticket { [JsonPropertyName("ticket_state")] public TicketState State { get; set; } } public enum TicketState { InProgress, WaitingOnCustomer, Resolved } [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(Ticket))] internal partial class JsonContext : JsonSerializerContext { }
解决方案
只需修改JsonSourceGenerationOptions特性,添加枚举转换器并指定蛇形小写命名策略即可,具体修改如下:
- 在
JsonSourceGenerationOptions特性中,添加Converters = new[] { typeof(JsonStringEnumConverter) },启用枚举转字符串的序列化规则 - 同时设置
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,让枚举成员名称自动转换为蛇形小写格式
修改后的完整代码:
Ticket ticket = new Ticket() { State = TicketState.InProgress }; string serialized = JsonSerializer.Serialize(ticket, JsonContext.Default.Ticket); Console.WriteLine(serialized); public class Ticket { [JsonPropertyName("ticket_state")] public TicketState State { get; set; } } public enum TicketState { InProgress, WaitingOnCustomer, Resolved } [JsonSourceGenerationOptions( WriteIndented = true, Converters = new[] { typeof(JsonStringEnumConverter) }, PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower )] [JsonSerializable(typeof(Ticket))] internal partial class JsonContext : JsonSerializerContext { }
说明
JsonStringEnumConverter负责将枚举值序列化为对应的字符串名称,替代默认的数字值输出JsonNamingPolicy.SnakeCaseLower会自动将枚举的驼峰命名(如InProgress)转换为蛇形小写格式(如in_progress)- 这种通过源生成上下文统一配置的方式,无需在每个枚举属性上单独加特性,配置更简洁高效
内容的提问来源于stack exchange,提问作者PEK
相关产品推荐
相关产品推荐

