System.Text.Json全局配置枚举转字符串时如何让单个枚举序列化为数字
问题解答
该需求完全可以实现。
System.Text.Json中,单独标注在枚举类型或属性上的JSON转换器优先级高于全局配置的转换器,因此可以通过为特定枚举指定数字转换器来覆盖全局的字符串枚举转换规则。
实现步骤
前提说明
.NET 5及以上版本已经内置了JsonNumberEnumConverter<TEnum>类,专门用于将枚举序列化为数字值,无需额外自定义转换器。
方法1:对枚举全局生效(所有用到该枚举的位置都序列化为数字)
直接在fareStatus枚举上添加JsonConverter特性,指定使用数字枚举转换器即可:
using System.Text.Json.Serialization; [JsonConverter(typeof(JsonNumberEnumConverter<fareStatus>))] public enum fareStatus { None = 0, Club = 1, NoClub = 2 }
方法2:仅对特定属性生效
如果你只希望某个DTO类中用到的fareStatus属性序列化为数字,其他位置用到该枚举时仍遵循全局配置序列化为字符串,可将特性标注在对应属性上:
using System.Text.Json.Serialization; public class OrderDto { // 其他属性省略 [JsonConverter(typeof(JsonNumberEnumConverter<fareStatus>))] public fareStatus FareStatus { get; set; } }
低版本.NET适配(.NET Core 3.x)
如果使用的是没有内置JsonNumberEnumConverter的低版本.NET,可自定义简单的数字枚举转换器,逻辑如下:
public class JsonNumberEnumConverter<TEnum> : JsonConverter<TEnum> where TEnum : Enum { public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.Number) { var value = reader.GetInt32(); return (TEnum)Enum.ToObject(typeof(TEnum), value); } return (TEnum)Enum.Parse(typeof(TEnum), reader.GetString()!); } public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options) { writer.WriteNumberValue(Convert.ToInt32(value)); } }
自定义完成后,再按照上述方法标注特性即可。
效果验证
配置完成后,除了fareStatus(或指定属性)会序列化为0/1/2的数字值,其他所有枚举仍会遵循全局配置序列化为字符串,完全符合需求。
内容的提问来源于stack exchange,提问作者freedeveloper
相关产品推荐
相关产品推荐

