C# REST API中字符串枚举参数的标准化处理方案咨询
解决C# REST服务中字符串枚举的严格校验问题
针对你遇到的JsonStringEnumConverter的两个问题,可以通过System.Text.Json内置的配置选项直接解决,无需自行实现自定义转换器的Read/Write方法,具体方案如下:
1. 全局配置枚举序列化规则
在服务启动配置中(Program.cs或Startup.cs),为JsonSerializerOptions添加JsonStringEnumConverter时,传入特定配置参数:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter( // 可选:若需枚举名称与JSON字段大小写一致(如驼峰),可指定命名策略,否则传null JsonNamingPolicy.CamelCase, new JsonStringEnumConverterOptions { // 禁止传入整数作为枚举值 AllowIntegerValues = false, // 遇到未知字符串枚举值时抛出异常,可被全局错误中间件捕获 UnknownEnumValueHandling = JsonUnknownEnumValueHandling.Throw })); });
参数说明:
AllowIntegerValues = false:直接禁用整数形式的枚举输入,传入整数时会触发序列化异常。UnknownEnumValueHandling = JsonUnknownEnumValueHandling.Throw:当请求体中传入未定义的枚举字符串(如"OTHER")时,会抛出JsonException,该异常可被你的全局错误处理中间件捕获并返回统一格式的错误响应。
2. 优化Swagger文档展示
为了让Swagger正确显示枚举的字符串选项,需在Swagger配置中添加枚举描述规则:
builder.Services.AddSwaggerGen(c => { // 将所有枚举类型在Swagger中显示为字符串选项 c.DescribeAllEnumsAsStrings(); });
这样Swagger文档中Sex字段的可选值会直接显示为"MALE"和"FEMALE",而非对应的枚举整数值,符合你的统一规范需求。
验证效果
- 当传入非法字符串(如
"OTHER"):服务会抛出JsonException,全局错误中间件可捕获并处理。 - 当传入整数值(如
1):服务会抛出JsonException,拒绝非字符串形式的枚举输入。 - 合法字符串输入(
"MALE"/"FEMALE"):正常序列化到枚举类型,无异常。
内容的提问来源于stack exchange,提问作者robsosno
相关产品推荐
相关产品推荐

