如何配置.NET 8的JSON解析以兼容.NET Framework 4.8的行为
.NET 8 JSON解析兼容NULL值到值类型的配置方案
问题场景
将应用移植到.NET 8后,发现JSON解析器对格式要求更严格:前端POST请求中给值类型字段传null时,模型绑定直接失败,返回null;而在.NET Framework 4.8中会自动将null转换为对应值类型的默认值(比如long类型的0)。
请求示例
POST http://localhost/SimplePost HTTP/1.1 Host: localhost Content-Type: application/json { "Name": "WTF", "Id": null }
模型定义
public class SimpleModel { public string Name { get; set; } public long Id { get; set; } }
不同框架下的行为对比
- .NET Framework 4.8接口代码:
[HttpPost] public ActionResult SimplePost(SimpleModel m) { return View(); }
结果:Id = 0,Name = "WTF"
- .NET 8接口代码:
[HttpPost] public ActionResult SimplePost([FromBody] SimpleModel m ) { return View(); }
结果:m is NULL
已尝试无效的方法
- 在构造函数中设置默认值:
public SimpleModel() { Name = string.Empty; Id = 1;}、public long Id { get; set; } = 1; - 为属性设置默认值:
public string name { get; set; } = string.Empty; - 为属性添加特性:
[DefaultValue(0)]、[DefaultValue("")] - 为属性添加特性:
[JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]、[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
可行解决方案
方案1:修改模型为可空值类型
直接将Id属性改为可空值类型,后续在业务代码中处理默认值:
public class SimpleModel { public string Name { get; set; } public long? Id { get; set; } }
使用时可通过Id ?? 0获取默认值。
方案2:配置System.Text.Json允许NULL转换为默认值
.NET 8默认使用System.Text.Json,默认不允许null赋值给非可空值类型。可在Program.cs中配置Json选项,开启允许null转换为对应值类型的默认值:
builder.Services.AddControllersWithViews() .AddJsonOptions(options => { // 保持属性名大小写不敏感(可选,和旧行为一致) options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 允许将null转换为非可空值类型的默认值 options.JsonSerializerOptions.NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowNull; });
配置后,null会被自动转换为long的默认值0,模型绑定成功。
方案3:切换回Newtonsoft.Json(Json.NET)
如果希望完全沿用.NET Framework的JSON解析行为,可切换回Newtonsoft.Json:
- 安装NuGet包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在
Program.cs中配置:
builder.Services.AddControllersWithViews() .AddNewtonsoftJson(options => { // 配置默认值填充,和旧行为一致 options.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Populate; });
内容的提问来源于stack exchange,提问作者JoeMcAlly
相关产品推荐
相关产品推荐

