如何让OrchestrationRuntimeStatus枚举序列化时输出整数而非字符串
解决方案
你当前枚举序列化为字符串的核心原因是RuntimeStatus属性上显式标注了[JsonConverter(typeof(StringEnumConverter))]特性,该特性会强制Newtonsoft.Json将枚举值序列化为名称字符串,按以下方案调整即可输出对应的整数值:
方案1:直接移除属性上的转换器特性(最简便)
删除status类中RuntimeStatus属性上的[JsonConverter(typeof(StringEnumConverter))]标记即可,默认配置下Newtonsoft.Json会将枚举类型序列化为对应的底层整数值:
public sealed class status { // 移除JsonConverter特性标记即可 public OrchestrationRuntimeStatus RuntimeStatus { get; set; } }
方案2:全局配置序列化规则(适用于所有枚举统一输出数值的场景)
如果你是在ASP.NET Core项目中,可通过全局配置覆盖序列化规则,无需修改单个属性的标记:
基于Newtonsoft.Json(Json.NET)的配置
在Program.cs(.NET 6+)中添加如下配置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 移除全局的字符串枚举转换器,默认输出数值 options.SerializerSettings.Converters.RemoveAll(c => c is StringEnumConverter); });
基于System.Text.Json的配置
如果你使用的是.NET自带的System.Text.Json序列化组件,配置如下:
builder.Services.AddControllers() .AddJsonOptions(options => { // 移除全局的字符串枚举转换器,默认输出数值 options.JsonSerializerOptions.Converters.RemoveAll(c => c is JsonStringEnumConverter); });
方案3:单独为当前返回接口自定义序列化配置
如果你需要保留其他场景下枚举序列化为字符串的逻辑,仅在当前接口返回数值,可在构造返回结果时指定序列化设置:
// 自定义序列化配置,不使用StringEnumConverter var serializeSettings = new JsonSerializerSettings { Converters = new List<JsonConverter>() }; // 手动序列化对象后再传入返回结果,或者修改OkObjectResultWithHeaders方法支持传入自定义序列化配置 var jsonResult = JsonConvert.SerializeObject(statusObj, serializeSettings); return new OkObjectResultWithHeaders(jsonResult, headers) { ContentType = "application/json" };
调整完成后,接口返回的RuntimeStatus字段就会输出-1、0这类对应的整数值,反序列化时也同时支持传入整数值自动映射到对应的枚举成员。
内容的提问来源于stack exchange,提问作者MathGeek
相关产品推荐
相关产品推荐

