.NET API控制器为何将字符串解析为int 0而非返回Bad Request?
解决.NET API中int字段非法字符串输入被静默转为0的问题
问题核心:默认情况下,.NET的JSON解析器会将无法转换为int的字符串静默转为0,导致无法区分「未传该字段」和「传了非法值」两种场景,需要让非法输入直接返回Bad Request。
方法1:开启System.Text.Json严格解析模式(推荐)
如果项目使用.NET自带的System.Text.Json,在Program.cs中配置JSON选项,禁止自动将字符串转换为数字:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.Strict; });
配置后:
- 当请求中
Type传入字符串(如示例1的"This is invalid"),框架会直接返回400 Bad Request - 未传
Type的合法请求(如示例2),Type会保持默认值0,不影响业务逻辑
方法2:改用可空int类型明确区分场景
修改模型类,将Type改为可空int类型:
public class Foo { public string Name { get; set; } public int? Type { get; set; } }
此时:
- 若请求传入无法转换为int的字符串,JSON解析失败,直接返回
400 Bad Request - 未传
Type时,Type值为null,可在业务逻辑中手动设置默认值:var effectiveType = foo.Type ?? 0;
方法3:针对Newtonsoft.Json的自定义转换器
如果项目使用Newtonsoft.Json(Json.NET),可通过自定义转换器禁止字符串转int:
- 定义严格int转换器:
public class StrictIntConverter : JsonConverter<int> { public override int ReadJson(JsonReader reader, Type objectType, int existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.String) { throw new JsonException("Type字段必须为整数类型"); } return Convert.ToInt32(reader.Value); } public override void WriteJson(JsonWriter writer, int value, JsonSerializer serializer) { writer.WriteValue(value); } }
- 在
Program.cs中注册配置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new StrictIntConverter()); options.SerializerSettings.Error = (sender, args) => args.ErrorContext.Handled = false; });
配置后,非法字符串输入会触发异常并返回400 Bad Request,未传Type时保持默认值0。
内容的提问来源于stack exchange,提问作者AshNawa
相关产品推荐
相关产品推荐

