You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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:

  1. 定义严格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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:10:28