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

如何配置.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:

  1. 安装NuGet包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. 在Program.cs中配置:
builder.Services.AddControllersWithViews()
    .AddNewtonsoftJson(options =>
    {
        // 配置默认值填充,和旧行为一致
        options.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Populate;
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:13:17