如何使用System.Text.Json将枚举序列化为自定义字符串名称
解决System.Text.Json枚举序列化时使用EnumMember自定义值的问题
问题出在JsonStringEnumConverter默认不会读取EnumMember特性的自定义值,需要显式配置让它启用这个功能,以下两种方案任选其一:
方案1:在属性上配置转换器参数
修改SerializationTest类的属性特性,给JsonStringEnumConverter传入UseEnumMemberNames选项:
public sealed class SerializationTest { [JsonPropertyName("type")] [JsonConverter(typeof(JsonStringEnumConverter), JsonStringEnumConverterOptions.UseEnumMemberNames)] public SerializationType Type { get; set; } }
这样序列化时就会自动读取EnumMember的Value值,输出预期的system_serialization。
方案2:全局配置序列化选项
如果希望全局生效,在序列化时传入配置好的JsonSerializerOptions:
var myObject = new SerializationTest { Type = SerializationType.System }; var options = new JsonSerializerOptions { Converters = { new JsonStringEnumConverter(JsonStringEnumConverterOptions.UseEnumMemberNames) } }; var content = JsonSerializer.Serialize(myObject, options);
执行后会得到{"type":"system_serialization"}的正确结果。
注意事项
- 该方案适用于.NET 5及以上版本,因为
JsonStringEnumConverterOptions是在.NET 5中引入的。 - 如果使用的是.NET Core 3.x,需要自定义枚举转换器来读取
EnumMember特性的值,或者切换到Newtonsoft.Json(后者默认支持EnumMember)。
内容的提问来源于stack exchange,提问作者Lucas Rafaell
相关产品推荐
相关产品推荐

