.NET6 Web API POST传值时Request Model为null如何解决
.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

