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

.NET6 Web API POST传值时Request Model为null如何解决

.NET 6 Web API 兼容JSON类型不匹配传参的实现方案

.NET 6及以上版本默认使用的System.Text.Json反序列化默认采用严格类型匹配规则,不会像Newtonsoft.Json那样自动完成字符串格式值到目标类型的转换,类型不匹配时会直接触发反序列化失败,最终导致请求模型绑定为null。可根据实际场景选择以下方案解决:

方案1:开启内置宽松转换规则(适配数值、枚举场景)

System.Text.Json内置了数值类型从字符串自动读取的支持,在Program.cs中配置全局JSON选项即可开启,可覆盖数值、枚举类的字符串传参场景:

// 需引入命名空间 using System.Text.Json.Serialization;
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 自动将"123"这类字符串格式数字转换为int/long/decimal等数值类型
        options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
        // 自动将字符串格式的枚举值转换为对应枚举类型
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    });

注意:.NET 6 内置规则不支持bool类型的字符串自动转换,传入"true"/"false"格式值依然会绑定失败,需要搭配方案2的自定义转换器使用。

方案2:自定义通用转换器补全bool等特殊类型兼容

通过自定义JsonConverter<T>实现bool类型的宽松解析,支持原生布尔值、字符串格式布尔值("true"/"false"/"1"/"0"/"yes"/"no")、数字格式布尔值(0/1)自动转换,代码如下:

public class FlexibleBoolConverter : JsonConverter<bool>
{
    public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return reader.TokenType switch
        {
            JsonTokenType.True => true,
            JsonTokenType.False => false,
            JsonTokenType.String => reader.GetString()?.Trim().ToLower() switch
            {
                "true" or "1" or "yes" => true,
                "false" or "0" or "no" => false,
                _ => throw new JsonException($"值 {reader.GetString()} 无法转换为Boolean类型")
            },
            JsonTokenType.Number => reader.GetInt32() != 0,
            _ => throw new JsonException($"不支持的Boolean值类型:{reader.TokenType}")
        };
    }

    public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
    {
        // 序列化时依然输出标准布尔值,不影响接口返回格式
        writer.WriteBooleanValue(value);
    }
}

将该转换器注册到全局JSON选项即可生效:

options.JsonSerializerOptions.Converters.Add(new FlexibleBoolConverter());

如果还有DateTime、Guid等其他类型需要兼容字符串传参,按照相同逻辑实现对应类型的JsonConverter<T>并注册即可。

方案3:切回Newtonsoft.Json作为默认序列化器(100%兼容旧行为)

如果需要完全对齐.NET 5及之前版本的JSON序列化/反序列化逻辑,不需要额外写兼容代码,可以直接替换默认序列化组件:

  • 安装NuGet包Microsoft.AspNetCore.Mvc.NewtonsoftJson
  • 在Program.cs中修改服务配置:
builder.Services.AddControllers()
    .AddNewtonsoftJson();

配置完成后所有JSON序列化、模型绑定逻辑会和使用Newtonsoft.Json时完全一致,自动兼容所有类型不匹配的宽松转换场景。

注意:该配置仅覆盖MVC管道内的模型绑定、接口返回序列化逻辑,项目中手动调用JsonSerializer(System.Text.Json)实现的序列化/反序列化代码不会受影响,需要单独调整。

内容的提问来源于stack exchange,提问作者Mazhar Hayat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:12:32